3

C++ 标准的第 7.1 节提到了“extern”作为存储类说明符。

N3126 - “extern 说明符只能应用于变量和函数的名称。extern 说明符不能用于类成员或函数参数的声明。有关使用 extern 说明符声明的名称的链接,请参见 3.5。[注意:extern 关键字也可以用在显式实例化和链接规范中,但在这种情况下它不是存储类说明符。——尾注]

我了解这个关键字,它在“链接规范”的上下文中使用,但我无法掌握使用“extern”作为存储说明符。

  1. 不是所有的“外部”名称都有静态存储持续时间吗?
  2. 如果对 1 的回答是肯定的,那么为什么会出现这种冗余?兼容性?
4

3 回答 3

7

extern是一个存储类说明符。这只是语言语法的一个事实。extern取决于程序的使用位置,它对程序的语义有许多影响。它在任何地方都没有相同的效果。它影响对象的存储持续时间和链接,还有助于确定某些声明是否也是定义。

例如:

int a; // Ex1

extern int b; // Ex2

例如,如果Ex1Ex2where 在全局范围内,那么它们都将引用具有静态存储持续时间和外部链接的对象。但是,在 C++ 中,第一个是定义(C 中的暂定定义),而第二个不是。在这个例子extern中没有改变声明对象的存储期限或链接。

如果Ex1andEx2发生在函数体中,则a表示具有自动存储持续时间且没有链接b的对象,但将引用具有外部链接和静态存储持续时间的对象。在这个例子中,extern在链接、存储持续时间以及它是否是定义方面都影响了声明的含义。

最后,在 C++ 中,这是一个示例,其中 的唯一效果extern是将链接从内部更改为外部。

const int c = 5; // static storage duration, internal linkage

extern const int d = 10; // static storage duration, external linkage
于 2010-10-22T06:57:45.387 回答
2

它本身并不是真正的存储说明符。它像其他存储说明符一样位于变量名之前,但它所做的只是关闭编译器并告诉链接器它还有更多工作要做。

于 2010-10-22T04:57:30.550 回答
0

extern 关键字通知编译器存在外部变量(或函数),即使编译器无法在当前正在编译的文件中找到它它强制外部链接

于 2018-05-31T15:17:30.770 回答