无法理解这里有什么问题:
我有main.cpp文件,其中包括:
#include "lexan.h"
...
lexan.h文件:
#ifndef _LEXAN_
#define _LEXAN_
enum Statements ...
//some function prototypes
...
struct TokensList {
Statements statement;
std::string value;
struct TokensList *next;
};
struct TokensList *tokens = NULL;
#endif _LEXAN_
在lexan2.h中:
#include "lexan.h"
// and some function prototypes
问题是我收到链接错误2005:
1>lexan2.obj : error LNK2005: "struct TokensList * tokens" (?tokens@@3PAUTokensList@@A) already defined in lexan.obj
1>main.obj : error LNK2005: "struct TokensList * tokens" (?tokens@@3PAUTokensList@@A) already defined in lexan.obj
我的错误在哪里?我以为
#ifndef _LEXAN_
#define _LEXAN_
在lexan.h文件中可以保护我免受此类链接问题的影响。
最佳答案
您要在头文件struct TokensList * tokens
中创建lexan.h
,然后在与 One Definition Rule(ODR) ojit_r 冲突的lexan.cpp
和lexan2.cpp
中都包含头。
请注意, header 防护可防止在相同的 Translation Unit 中包含相同的 header 。在头文件中创建变量时,将在包含头的每个翻译单元中创建具有相同名称的变量副本。这会导致链接器抱怨的项目中有多个相同的命名变量。
解决方案:
如果需要在文件之间共享它,则需要使用extern
。
如何使用extern
?
看一下:
What are extern variables in C?
How to correctly use the extern
keyword in c?