【问题标题】:Why can extern be applied to definitions?为什么 extern 可以应用于定义?
【发布时间】:2011-10-23 14:26:09
【问题描述】:

为什么这是合法的?

extern int foo = 0xF00; // Gets a warning, still compiles

extern void bar() { // No warning
  int x;
}

是否有理由允许这样做?

【问题讨论】:

    标签: c++ c extern


    【解决方案1】:

    有时候很有用

    extern const int foo = 0xF00;
    

    如果没有 extern,在 C++ 中 foo 将是 static 并具有内部链接(这意味着您不能使用来自另一个翻译单元的 foo)。

    在您的示例中,这两种情况下的 extern 都是多余的。 In C99 an extern can make a difference for inline functions..

    【讨论】:

    • @ninjalj 是的,没错。在 C 中,foo 即使没有 extern,也会有外部链接。
    【解决方案2】:

    在函数的情况下,我觉得就像写:

    extern void bar();
    void bar()
    {
      int x;
    }
    

    这必须是合法的,因为具有定义的文件可能包含带有此类声明的标头。

    【讨论】:

      【解决方案3】:

      IIUC,在 C 标准中,定义被视为带有初始化器的声明,因此适用于声明的所有内容同样适用于定义。

      (实际上,定义将是为变量分配存储空间的声明,因此 C 的暂定定义(没有初始化器)将符合条件,而那些充当定义但没有初始化器的 C++ 声明也将符合条件。指出定义本质上是一个声明加上一些附加的行为仍然适用)。

      【讨论】:

        猜你喜欢
        • 2021-03-23
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        • 1970-01-01
        • 1970-01-01
        • 2022-12-22
        • 2017-07-10
        • 1970-01-01
        相关资源
        最近更新 更多