gpt4 book ai didi

c++ - 链接错误(#ifndef 没有按预期工作)

转载 作者:行者123 更新时间:2023-11-30 01:26:43 26 4
gpt4 key购买 nike

无法理解这里有什么问题:我有 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然后在 lexan.cpp 中包含标题& lexan2.cpp这违反了 One Definition Rule(ODR)

注意,header guards 防止在相同的 Translation Unit 中包含相同的 header 。在头文件中创建变量时,会在包含头文件的每个翻译单元中创建具有相同名称的变量拷贝。这会导致链接器提示您的项目中有多个相同的命名变量。

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

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

关于c++ - 链接错误(#ifndef 没有按预期工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9835155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com