无法理解这里有什么问题:
我有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.cpplexan2.cpp中都包含头。

请注意, header 防护可防止在相同的 Translation Unit 中包含相同的 header 。在头文件中创建变量时,将在包含头的每个翻译单元中创建具有相同名称的变量副本。这会导致链接器抱怨的项目中有多个相同的命名变量。

解决方案:
如果需要在文件之间共享它,则需要使用extern

如何使用extern
看一下:
What are extern variables in C?
How to correctly use the extern keyword in c?

10-08 20:04