在全局变量的头部和源代码中的“extern int x”中使用extern关键字是否正确?

时间:2012-09-17 08:20:04

标签: c++ global-variables extern

有一个名为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。

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

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