2

有一个名为的变量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

这行得通。

问题出在哪里?

将变量初始化为 inconstants.cpp使其适用于情况 1 和 3。

这是怎么回事?哪种方法是正确的?

4

3 回答 3

3

您可以根据需要多次声明一个变量,您可以而且必须只定义一次。

extern int BOT_TIME;

是一个声明。

int BOT_TIME;

是一个定义。

定义必须出现在单个实现文件中。

由于默认情况下非常数是 extern ,所以我决定保留该关键字。

没有。你怎么想的?

要回答问题:

1)没有定义,只有声明。

2)假设是错误的。您多次定义符号。

3)它有效,因为这是正确的方法。

从评论:

当你用 声明一个变量时extern,你指定它有外部链接,是的,但你只声明,而不是定义它。如果您不使用extern关键字,它仍然具有外部链接,但它也是一个定义。

于 2012-09-17T08:21:47.490 回答
2

您需要在头文件中声明变量并在源文件中定义一次且仅一次。
正确的方法是:

常量.h

//declare the symbol as extern
extern int BOT_TIME;

常量.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

您可以多次声明一个变量,但您只能定义一次。
如果您多次定义一个变量,则违反了一次定义规则

extern int BOT_TIME;

是一个声明,并且#1只进行两次相同的声明,这是允许的,但它不起作用,因为您从未定义变量。请注意,每个extern变量都必须定义一次,否则编译器找不到它的定义并因此抱怨。

#2您在不同的翻译单元中多次定义相同的符号。这违反了单一定义规则,因此链接器报告相同。

#3是正确的方法。

好读:
定义和声明有什么区别?

于 2012-09-17T08:24:52.763 回答
0
extern int x;     // declaration
int x;            // definition
extern int x = 3; // definition

通常,您需要在头文件中声明,用于需要了解x. 您需要一个定义,在一个源文件中,以便实际上有一个 object x

于 2012-09-17T13:34:27.430 回答