c++ - X宏重新定义

标签 c++ c macros x-macros

当我在多个头文件使用的头文件中包含“xmacro.h”时,出现链接错误:

Error LNK2005: "char const * * iD_Strings" (?iD_Strings@@3PAPBDA) already defined in header_file.obj

1.//"xmacro.h"
2.
3.// (1) Define code generating macro
4.
5.   #ifndef XMACRO_H
6.   #define XMACRO_H
7.
8.    #define GENERATE_IDS \
9.   X(_Name, "/Name") \
10.   X(_ID, "/ID")
11.
12.  // (2) Define X-Macro for generating enum members
13.
14.  #define X(id, idString) id, 
15.   enum IDs
16.  {
17.     ID_LOWERBOUND = -1,
18.    GENERATE_IDS
19.   NUM_IDS
20.  };
21.  #undef X
22.
23.  // (3) Define X-Macro for generating string names
24.
25.  #define X(id, idString) idString,
26.  const char* iD_Strings[] =
27.  {   
28.     GENERATE_IDS
29.     NULL
30.  };
31.  #undef X
32.
33.  #endif

当我在第 23 行定义用于生成字符串名称的 X-Macro 时,它会生成错误。我如何在不重新定义它的情况下使用单个宏?

最佳答案

您的头文件包含 iD_Strings定义。当您从不同的源文件中包含它时,它会多次链接。即使定义相同,也会导致冲突。

您可以将 iD_Strings 声明为 static(C 方式)或将其包装在匿名命名空间中(C++ 方式)以解决此问题。

关于c++ - X宏重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2187724/

相关文章:

c - __m128 中至少有 4 个 SP 值

你能帮我写一个可以自行打印的短代码吗?

macros - 为什么符号 pat ... 表示方案宏模式中的零个或多个表达式

c++ - 选择排序算法的标准是什么?

c++ - OpenMP #pragma,只有一个线程在处理我的代码

c++ - delete[] 在析构函数中分配的内存抛出错误

c - 在 OS X 上加载表面时 SDL2 预乘 alpha channel ?

计算多边形的 OpenGL 面法线

excel - 使用宏对表格进行排序

android - 如何在 native 代码中从 Android 扩展文件中获取文件数据