2010-02-02 115 views
1

在i包括其中使用由多个头文件我得到联误差在头文件中的“xmacro.h”:X-宏重定义

Error LNK2005: "char const * * iD_Strings" ([email protected]@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 

它产生时,我限定X-错误用于在第23行生成字符串名称的宏。我将如何使用单个宏而不重新定义它?

回答

3

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

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

+0

的确,我设法误读了那个。 – 2010-02-02 23:47:01

1

执行X-Macros(我一直称之为列表宏)的一种更好的方法是将运算符作为参数传递给列表,然后可以同时保留多个“运算符”:

#define GENERATE_IDS(_) \ 
_(Name) \ 
_(Id) 

enum IDs 
{ 
    ID_LOWERBOUND = -1, 
    #define MK_ID_ENUM(n) _##n, 
    GENERATE_IDS(MK_ID_ENUM) 
    NUM_IDS 
} 

const char* iD_Strings[] = 
{ 
    #define MK_ID_STRING(n) "/" #n, 
    GENERATE_IDS(MK_ID_STRING) 
    NULL 
}; 

请注意,您仍然必须声明唯一的标识符,但调用GENERATE_IDS()宏来声明对象确实属于.c/.C++正文而不是头。