看到this回答后 我有这个疑问。 在我的项目中, 我已经看到一些外部变量被声明和定义如下:
file1.h
extern int a;
file1.c中
extern int a=10;
但在我提到的链接中,它说在c文件中应该定义为:
int a = 10;
在定义期间添加extern
关键字是否具有任何目的/含义。
或顺便说一下它是否重要?
答案 0 :(得分:4)
它没有改变含义。只有在声明变量时extern
才有意义。 使用extern
定义变量是相同的,因为所有未标记为static
的全局变量都是默认情况下链接器可见的符号。
请注意,如果您不想初始化变量,即没有部分= 10
,编译器将假定extern int a
始终是声明而不是定义。同样,全局int a
始终是定义,而不仅仅是声明。
答案 1 :(得分:3)
这取决于。在这种情况下,它没有区别,但它可以。
这里有两个问题:定义与公正,以及联系。
并且C ++不以正交方式处理它们。在C ++中,
变量或引用的声明是一个定义,当且仅当
既不存在extern
关键字也不存在初始化。 (注意
函数,类型和模板的规则是不同的。)所以:
extern int a; // not a definition
int a; // definition
extern int a = 42; // definition
int a = 42; // definition
规则说你必须有一个定义,所以你放了一个 源文件中的定义,以及标题中的声明。
关于链接,声明为变量或引用的符号
如果在命名空间范围内声明它,则具有外部链接
声明static
,并且不是const
(在C ++ 11中也不是constexpr
)
或已被宣布为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
的{{1}}参数实例化模板,因为模板是使用值42实例化的,而不是
变量int const a =
42;
。)