带有 extern 和没有 extern 的函数的本地/块范围声明之间的区别



似乎在C++ extern(不后跟语言链接字符串文字(对命名空间范围内的函数声明没有区别(带有extern和没有extern的函数声明之间的区别(。 但是它对块范围函数声明有任何影响吗? 还是没有extern的本地函数声明总是等同于带有extern的声明?

namespace {
  void f() {
     extern void g(); // has external linkage
     g();
  }
  void f2() {
     void g();        // always the same, as if, without extern
     g();
  }
}

谢谢!

这里的规则来自[basic.link]:

块作用域中声明的函数的名称和块作用域声明的变量的名称extern 声明有联系。如果存在具有相同名称的链接的实体的可见声明,并且 类型,忽略在最内层封闭命名空间范围(块范围声明(之外声明的实体 声明同一实体并接收上一个声明的链接。如果有多个这样的 匹配实体,程序格式不正确。否则,如果未找到匹配的实体,则块范围实体 接收外部链接。

因此,带和不带external的块范围函数声明之间没有区别。但请注意一个有趣的例子:

static void f();
void g() {
    extern void f(); // internal linkage
}

在这里,块作用域f重新声明::f并接收其相同的链接:内部。即使它被标记为extern.但是缺少extern关键字的存在是无关紧要

无论函数是否具有 extern 说明符,在任何情况下它都具有外部链接(如果它没有明确声明为具有内部链接(。

但是,本地函数声明可以在外部作用域中隐藏具有相同名称的其他函数声明。

考虑以下演示程序

#include <iostream>
void f( int ) { std::cout << "F( int )" << std::endl; }
void f( short ) { std::cout << "f( short )" << std::endl; }
int main() 
{
    void f( short );
    f( 10 );
    return 0;
}

它的输出是

f( short )

如果要注释本地声明,则输出将是

F( int )

最新更新