即使在使用 extern 和 #ifdef 时也已在 .obj 中定义
Already defined in .obj even when using extern and #ifdef
我有三个这样的文件:
head.h
#ifndef HEAD_
#define HEAD_
extern int f();
#endif
mycpp.cpp
#include "head.h"
int f() {
return 5;
}
myMain.cpp
#include <iostream>
#include "head.h"
#include "mycpp.cpp"
int main()
{
std::cout << f() << std::endl;
system("Pause");
return 0;
}
运行 此代码产生 link 错误:
LNK2005 "int __cdecl f(void)" (?f@@YAHXZ) already defined in mycpp.obj
如果我将 inline
添加到 mycpp.cpp
中的函数 f
,错误就会消失。
我的问题是如何在不使用 inline
函数的情况下摆脱这个错误?
P.S。这是作业,我只能修改 mycpp.cpp
文件。所以 #include "mycpp.cpp"
必须在那里。
我知道包含 cpp
文件不是个好主意,但我无法更改 myMain
文件。它是这样给出的。而且我不应该使用 inline
.
一般规则是:从不 #include
.cpp
文件。只应包含头文件。
此外,函数声明中的extern
在这里是多余的。在 变量声明 上,extern
将语句标记为声明而不是定义。但是在函数声明上这不是必需的,而且函数无论如何都有外部链接。
我有三个这样的文件:
head.h
#ifndef HEAD_
#define HEAD_
extern int f();
#endif
mycpp.cpp
#include "head.h"
int f() {
return 5;
}
myMain.cpp
#include <iostream>
#include "head.h"
#include "mycpp.cpp"
int main()
{
std::cout << f() << std::endl;
system("Pause");
return 0;
}
运行 此代码产生 link 错误:
LNK2005 "int __cdecl f(void)" (?f@@YAHXZ) already defined in mycpp.obj
如果我将 inline
添加到 mycpp.cpp
中的函数 f
,错误就会消失。
我的问题是如何在不使用 inline
函数的情况下摆脱这个错误?
P.S。这是作业,我只能修改 mycpp.cpp
文件。所以 #include "mycpp.cpp"
必须在那里。
我知道包含 cpp
文件不是个好主意,但我无法更改 myMain
文件。它是这样给出的。而且我不应该使用 inline
.
一般规则是:从不 #include
.cpp
文件。只应包含头文件。
此外,函数声明中的extern
在这里是多余的。在 变量声明 上,extern
将语句标记为声明而不是定义。但是在函数声明上这不是必需的,而且函数无论如何都有外部链接。