看到后this答案 我有这个疑问。 在我的项目, 我已经看到了一些声明的变量的extern和确定象下面这样:在定义变量时使用'extern'关键字
file1.h
extern int a;
file1.c中
extern int a=10;
但在我提到的链接中说,在c文件我
int a = 10;
是否定义过程中添加extern
关键字太有任何目的/意义:T应当像定义。 或顺便问一下?
看到后this答案 我有这个疑问。 在我的项目, 我已经看到了一些声明的变量的extern和确定象下面这样:在定义变量时使用'extern'关键字
file1.h
extern int a;
file1.c中
extern int a=10;
但在我提到的链接中说,在c文件我
int a = 10;
是否定义过程中添加extern
关键字太有任何目的/意义:T应当像定义。 或顺便问一下?
它不改变意思。 extern
只有当你在声明变量时才有意义。 定义变量与extern
是相同的,因为所有未标记为static
的全局变量都是链接器默认可见的符号。
注意,如果你不想初始化变量,即不具有部分= 10
,编译器将假定extern int a
总是声明而不是定义。在同样的意义上,具有int a
全局总是定义而不只是一个声明。
'int a'(在文件范围内)是C中的暂定义,C是一个定义,并且总是一个声明。我想你可能意思是:“......总是一个定义而不是一个声明”。 –
答案其实不正确。所有名称空间范围内未标记为'static'的非''const'变量对链接器都是可见的(具有外部链接)。 'const'变量具有内部链接(链接器不可见),除非在某处标记了'extern'。 –
@JamesKanze:这在C中是否属实?我认为这只是C++。 –
这取决于。在这种情况下,它没有区别,但它可以。
这里有两个问题:定义与正义宣言以及联系。 而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
。)
您引用的问题是一个C问题。你是否想把它标记为C++? –