无法理解这里有什么问题:我有main.cpp文件,其中包括:
#include "lexan.h"
...
Run Code Online (Sandbox Code Playgroud)
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_
Run Code Online (Sandbox Code Playgroud)
在lexan2.h中:
#include "lexan.h"
// and some function prototypes
Run Code Online (Sandbox Code Playgroud)
问题是我得到链接错误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
Run Code Online (Sandbox Code Playgroud)
我的错误在哪里?我以为
#ifndef _LEXAN_
#define _LEXAN_
Run Code Online (Sandbox Code Playgroud)
在lexan.h文件中可以保护我免受这种链接问题的影响.
您正在创建struct TokensList * tokens的头文件lexan.h,然后包括在两个头lexan.cpp和lexan2.cpp其违反了一个定义规则(ODR) .
请注意,标题保护防止在同一翻译单元中包含相同的标题.在头文件中创建变量时,将在包含标题的每个转换单元中创建具有相同名称的变量的副本.这导致项目中链接器抱怨的多个相同的命名变量.
解决方案:
如果需要跨文件共享,则需要使用extern.
怎么用extern?
看看:
C中的外部变量是什么?
如何extern在c中正确使用关键字?