有一个名为BOT_TIME
的变量因我的游戏难度而异,因此不是const
。有许多文件使用它。我打算将它用作全局变量。
1)在constants.h
我声明extern int BOT_TIME
。
在constants.cpp
中,我将其声明为extern int BOT_TIME
。
BUILD =>所有来源中对变量的未定义引用(是的,我已经包含了标题)。
2)在constants.h
我声明int BOT_TIME
。
在constants.cpp
中,我声明int BOT_TIME
。
由于non-consts
默认为extern
,因此我决定保留该关键字。
BUILD =>变量的多个定义(显示在包含constants.h的每个源文件中)
3)在constants.h
我声明extern int BOT_TIME
。
在constants.cpp
中,我将其声明为int BOT_TIME
。
这很有效。
问题出在哪里?
将变量初始化为constants.cpp
中的某个内容使其适用于案例1和3。
这是怎么回事? 哪种方法正确?
答案 0 :(得分:3)
您可以根据需要多次声明变量,您只需要定义一次。
extern int BOT_TIME;
是一份声明。
int BOT_TIME;
是一个定义。
定义必须出现在单个实现文件中。
由于非consts是默认的extern,我决定保留该关键字。
不。你觉得怎么样?
回答问题:
1)没有定义,只有声明。
2)假设是错误的。您可以多次定义符号。
3)它有效,因为这是正确的方法。
来自评论:
当您使用extern
声明变量时,您指定它具有外部链接,是,但您只声明,而不是定义它。如果你不使用extern
关键字,它仍然有外部链接,但它也是一个定义。
答案 1 :(得分:2)
您需要在头文件中声明变量,并在源文件中只定义一次 正确的方法是:
<强> constants.h 强>
//declare the symbol as extern
extern int BOT_TIME;
<强> constants.cpp 强>
#include "constants.h"
//define the symbol once and only once
int BOT_TIME;
<强> XXXX.cpp 强>
#include "constants.h"
//Include the header file which declares it extern in any source file
//you want to access it
//use BOT_TIME
您可以多次声明变量,但只能定义一次 如果您多次定义变量,则会违反 One Definition Rule 。
extern int BOT_TIME;
是一个声明而#1
只发出两次相同的声明,这是允许的,但它不起作用,因为你从未定义变量。注意每个extern
变量必须定义一次或者编译器无法找到它的定义,因而抱怨。
在#2
中,您在不同的翻译单元中多次定义相同的符号。这违反了One Definition规则,因此链接器报告相同。
#3
是正确的方法。
好读:
What is the difference between a definition and a declaration?
答案 2 :(得分:0)
extern int x; // declaration
int x; // definition
extern int x = 3; // definition
通常,您需要在头文件中声明需要了解x
的源文件。您需要在一个源文件中使用一个定义,以便实际存在对象x
。