c++ - C 预处理器防护?

标签 c++ c c-preprocessor guard

我正在开发一个 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 中定义。

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

(有关更多信息,请参见例如 What is the difference between a definition and a declaration?)

关于c++ - C 预处理器防护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15918955/

相关文章:

C++ : Accessing the contents of a pointer

c++ - 如何通过带有 UARTSerial 类的 USB 在 nucleo f446re 和 mbed 之间发送字节数组?

用于 Linux 的 C++ 2D 绘图工具

c - 如何更改 char* 全局?

c - Lua:查询用户数据对象的元表名称

c++ - 从具有通用返回类型的 crtp 基类调用派生类中的函数

C语言,如何包含从 "XXX.h"到<XXX.h>的文件”,也许使用Makefile?

c - 将 define 与 double constant 一起使用会导致在内联工作时计算失败

c++ - 预处理器 C++ 的工作

c - 在 C 预处理器中为其自身定义一些内容