变量已在a.obj中定义

时间:2012-12-18 17:27:04

标签: c nmake

  

可能重复:
  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上

这会导致什么? 感谢

1 个答案:

答案 0 :(得分:1)

  

但是我没有在a.c或a.h上定义它,只在b.h上

这不是它的工作原理。所有包含的头中的所有代码由预处理器放在一起并传递给编译器,然后编译器将其编译为目标文件。此代码称为“翻译单元”。如果在另一个翻译单元中定义了相同的变量,它也将出现在生成的目标文件中。然后,当您将这些目标文件链接在一起时,两者将定义相同的变量,因此链接器将抱怨重复的符号。

您应该做的是在一个* .c文件中定义变量,并且只在* .h文件中声明它extern。这样,其他翻译单元将知道变量,但不会尝试自己定义变量。它只会在包含实际定义的* .c文件的翻译单元中定义。