C预处理器防护装置

C Preprocessor Guards?

本文关键字:装置 处理器 预处理      更新时间:2023-10-16

我正在处理一个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

有人能给我一些建议吗(不是双关语(?

保护程序将防止在编译单元中定义两次内容。它们不会阻止在不同的编译单元中定义相同的东西。并且链接器消息指示这就是发生的_OPCodes,例如在libmain中定义的。

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

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

EDIT:这是基于最初的帖子,其中有一个拼写错误。显然,这不是OP的真正问题。

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

#ifndef CONFIG_H
#define CONFIG_H  // not CONFIG_G!
#ifndef CONFIG_H
#define CONFIG_G
... exciting stuff in C ....
#endif

这是一个打字错误,因为你得到了"已经定义的错误">

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

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

确保进行重建。

您可能还意外地包含了.cpp文件而不是.h文件。仔细检查所有包含的内容,以防万一。