C预处理器防护装置
C Preprocessor Guards?
我正在处理一个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
,例如在lib
和main
中定义的。
通常,标头应该只有函数和全局变量的声明,相应的定义将在其中一个源文件中提供。
(例如,请参阅定义和声明之间的区别?了解更多信息(
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
文件。仔细检查所有包含的内容,以防万一。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 预处理器:插入结构名称中的前一个行号
- 如何在c++中实现处理器调度模拟器
- C/C++预处理器是否可以检测一些编译器选项
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 在clang++预处理器中确定gcc工具链版本
- 不同/较旧的处理器运行c++代码的方式是否不同
- 用于交叉编译和CMake的预处理器宏的单元测试
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何比较两个同名的预处理器宏?
- 从预处理器获取 Windows 版本(C++ Win32)
- 如何摆脱为条件编译定义预处理器宏的需要?
- C 预处理器 - 现有定义的预置路径
- VS2015 预处理器定义与点
- 不带预处理器的调用方法/文件的文件名/行号
- 获取文件数据预处理器宏
- 有没有办法在 c++ 中拥有条件预处理器
- 如何在编译时定义C++预处理器指令的值?
- 修复"-Wunused-parameter"取决于预处理器条件的警告
- C预处理器防护装置