可能重复:
Is it possible to #Include in a “diamond heritage” stracture?
我正在构建一些看起来像这样的程序:
"a.c" #includes "a.h" and #includes "b.h"
"b.c" #includes "b.h"
假设我只在“b.h”中声明一个变量,名为“var”
在使用“nmake”在“cmd”上编译时,我收到以下错误:
b.obj:错误LNK2005:已经在a.obj
中定义了var
但是我没有在a.c或a.h上定义它,只在b.h上
这会导致什么? 感谢
答案 0 :(得分:1)
但是我没有在a.c或a.h上定义它,只在b.h上
这不是它的工作原理。所有包含的头中的所有代码由预处理器放在一起并传递给编译器,然后编译器将其编译为目标文件。此代码称为“翻译单元”。如果在另一个翻译单元中定义了相同的变量,它也将出现在生成的目标文件中。然后,当您将这些目标文件链接在一起时,两者将定义相同的变量,因此链接器将抱怨重复的符号。
您应该做的是在一个* .c文件中定义变量,并且只在* .h文件中声明它extern
。这样,其他翻译单元将知道变量,但不会尝试自己定义变量。它只会在包含实际定义的* .c文件的翻译单元中定义。