【问题标题】:extern storage class specifier外部存储类说明符
【发布时间】:2011-04-28 23:33:54
【问题描述】:

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

N3126 - “外部说明符可以是 仅适用于变量名 和功能。外部说明符 不能在声明中使用 类成员或函数参数。 对于声明的名称的链接 使用 extern 说明符,见 3.5。 [ 注意:extern 关键字也可以是 用于显式实例化和 链接规范,但它不是 存储类说明符 上下文。 ——尾注]

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

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

【问题讨论】:

  • 而 C99 标准将 typedef 加入了存储类说明符组合中 - typedef 与存储或链接无关...

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    例如:

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 其实,再看一下e.g. “可变”,我不明白这与“存储类”有什么关系。 “存储类”到底是什么意思/做什么?
      • 一些存储类(staticautoregister)指定变量将存储在什么内存中。其他存储类(constvolatile)影响编译器的方式生成代码来访问它们。 extern 也没有。
      • 是 const 和 volatile 存储类吗? C++ 将它们视为类型说明符而不是存储类说明符。虽然不确定 C。
      • @Chubsad:不,constvolatile 不是存储类说明符,它们是类型限定符。由于您在声明中只允许使用一个存储类说明符,因此如果 const 有一个那么(例如)static const int x = 5; 将是非法的。据我所知,在 C 和 C++ 中都是如此。
      猜你喜欢
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      相关资源
      最近更新 更多