链接错误(#ifndef无法按预期工作)

max*_*mus 1 c++

无法理解这里有什么问题:我有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文件中可以保护我免受这种链接问题的影响.

Alo*_*ave 5

您正在创建struct TokensList * tokens的头文件lexan.h,然后包括在两个头lexan.cpplexan2.cpp其违反了一个定义规则(ODR) .

请注意,标题保护防止在同一翻译单元中包含相同的标题.在头文件中创建变量时,将在包含标题的每个转换单元中创建具有相同名称的变量的副本.这导致项目中链接器抱怨的多个相同的命名变量.

解决方案:
如果需要跨文件共享,则需要使用extern.

怎么用extern
看看:
C中的外部变量是什么?
如何extern在c中正确使用关键字?