1

我正在开发一个C项目,并尝试使用可在 C++ 中使用的预处理器防护:

#ifndef CONFIG_H
#define CONFIG_H

... exciting stuff in C ....

#endif

在我的源代码中包含这个似乎在 Visual Studio 中没有效果,因为当我在多个文件中包含给定文件时,例如Config.h,编译器会给我以下错误:

1>main.obj : error LNK2005: _OPCodes already defined in lib.obj
1>main.obj : error LNK2005: _OPTotal already defined in lib.obj
1>main.obj : error LNK2005: _RegCodes already defined in lib.obj
1>main.obj : error LNK2005: _RegTotal already defined in lib.obj
1>main.obj : error LNK2005: _UDSTotal already defined in lib.obj

谁能给我任何指示(没有双关语),好吗?

4

4 回答 4

9

守卫将防止在编译单元中定义两次。它们不会阻止在不同的编译单元中定义相同的东西。并且链接器消息表明这是发生_OPCodes的情况,例如在lib和 中定义main

通常,头文件应该只有函数和全局变量的声明,相应的定义将在源文件之一中提供。

(例如,请参阅定义和声明之间有什么区别?了解更多信息)

于 2013-04-10T07:14:14.787 回答
4

编辑:这是基于原始帖子,其中有一个错字。显然,这不是 OP 的真正问题。

你给你的守卫起了两个不同的名字。他们必须匹配。

#ifndef CONFIG_H
#define CONFIG_H  // not CONFIG_G!
于 2013-04-10T06:55:25.230 回答
2
#ifndef CONFIG_H
#define CONFIG_G

... exciting stuff in C ....

#endif

这是一个错字,因为你得到“已经定义的错误”

在您的头文件中,您定义的是 CONFIG_G 而不是 CONFIG_H ,因此从下一个源文件中 #ifndef CONFIG_H 为真,因此它再次包含相同的内容

于 2013-04-10T06:59:13.513 回答
0

如果您重命名了任何文件,则应将它们从解决方案中删除并重新添加。有时 Visual Studio 对此有点奇怪,当它们留在里面时会导致链接器错误。

确保进行重建。

您也可能不小心包含了.cpp文件而不是.h文件。仔细检查所有包括以防万一。

于 2013-04-10T07:24:33.173 回答