在定义变量时使用'extern'关键字

时间:2011-09-30 06:53:59

标签: c variables extern

看到this回答后 我有这个疑问。 在我的项目中, 我已经看到一些外部变量被声明和定义如下:

file1.h

extern int a;

file1.c中

extern int a=10;

但在我提到的链接中,它说在c文件中应该定义为:

int a = 10;

在定义期间添加extern关键字是否具有任何目的/含义。 或顺便说一下它是否重要?

2 个答案:

答案 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) 或已被宣布为externconst可以提供的事实 可变内部联系偶尔意味着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;。)