2011-09-30 47 views
2

看到后this答案 我有这个疑问。 在我的项目, 我已经看到了一些声明的变量的extern和确定象下面这样:在定义变量时使用'extern'关键字

file1.h

extern int a; 

file1.c中

extern int a=10; 

但在我提到的链接中说,在c文件我

int a = 10; 

是否定义过程中添加extern关键字太有任何目的/意义:T应当像定义。 或顺便问一下?

+1

您引用的问题是一个C问题。你是否想把它标记为C++? –

回答

4

它不改变意思。 extern只有当你在声明变量时才有意义。 定义变量与extern是相同的,因为所有未标记为static的全局变量都是链接器默认可见的符号。

注意,如果你不想初始化变量,即不具有部分= 10,编译器将假定extern int a总是声明而不是定义。在同样的意义上,具有int a全局总是定义而不只是一个声明

+0

'int a'(在文件范围内)是C中的暂定义,C是一个定义,并且总是一个声明。我想你可能意思是:“......总是一个定义而不是一个声明”。 –

+1

答案其实不正确。所有名称空间范围内未标记为'static'的非''const'变量对链接器都是可见的(具有外部链接)。 'const'变量具有内部链接(链接器不可见),除非在某处标记了'extern'。 –

+0

@JamesKanze:这在C中是否属实?我认为这只是C++。 –

3

这取决于。在这种情况下,它没有区别,但它可以。

这里有两个问题:定义与正义宣言以及联系。 而C++不能以正交的方式处理它们。在C++中,当且仅当 关键字和初始化都不存在时,变量或引用的 声明才是定义。 (注意 ,该规则是函数,类型和模板不同)。所以:

extern int a;  // not a definition 
int a;    // definition 
extern int a = 42; // definition 
int a = 42;   // definition 

规则说你必须有一个确切的定义,所以你把 定义在源文件中,并在声明一个标题。

至于联动,声明为一个变量或一个参考 一个符号具有外部连接如果在命名空间范围中声明,并不 声明static,并且或者(在C++ 11也不constexpr)不const 或已被宣布为extern。该const可以给 变量内部链接的事实偶尔指extern是 必要的:

int const a = 42;   // internal linkage 
extern int const a = 42; // external linkage 

注意,extern不必在同一声明:

extern int const a;   // declaration, in header... 
int const a = 42;   // external linkage, because of 
          // previous extern 

仍,我偶尔需要extern;通常是因为我想 使用本地常量来实例化模板。 (这仅是一个 问题,如果模板参数需要一个指针或引用。您可以 实例化与int参数与int const a = 42;模板,因为模板被实例化与该值42,而不是 可变a。)