外部存储类说明符

时间:2010-10-22 04:46:04

标签: c++ extern storage-class-specifier

C ++标准的第7.1节提到'extern'是一个存储类说明符。

  

N3126 - “extern说明符可以是   仅适用于变量名称   和功能。 extern说明符   不能用于申报   类成员或函数参数。   用于声明名称的链接   有外部说明符,见3.5。 [   注意:extern关键字也可以   用于显式实例化和   联系规范,但事实并非如此   这样的存储类说明符   上下文。 - 后注]

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

  1. 并非所有'extern'名称都有静态存储时间吗?
  2. 如果对1的答案是肯定的,那么为什么会出现这种冗余? C兼容性?

3 个答案:

答案 0 :(得分:6)

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

E.g:

int a; // Ex1

extern int b; // Ex2

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

如果函数体中出现Ex1Ex2,则a将引用具有自动存储持续时间且没有链接的对象,但b将引用具有自动存储持续时间的对象外部链接和静态存储持续时间。在此示例中,extern已在链接,存储持续时间以及是否为定义中影响了声明的含义。

最后,在C ++中,这是一个例子,其中extern的唯一影响是改变从内部到外部的链接。

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

extern const int d = 10; // static storage duration, external linkage

答案 1 :(得分:2)

本身并非真正存储说明符。它出现在变量名称之前,就像其他存储说明符那样,但它只是关闭编译器并告诉链接器它还有更多的工作要做。

答案 2 :(得分:0)

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