功能的本地/块范围声明与extern和没有它的区别

时间:2016-07-26 11:05:06

标签: c++ scope extern linkage function-declaration

似乎在C ++中extern(后面没有语言链接字符串文字)在命名空间范围(Difference between declaration of function with extern and without it)上的函数声明没有区别。但它对块作用域函数声明有什么影响吗?或者是没有extern的本地函数声明总是等同于extern

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

  

块作用域中声明的函数的名称以及块作用域extern声明的变量的名称   宣言有联系。如果有一个具有相同名称和链接的实体的可见声明   类型,忽略在最内层封闭命名空间范围之外声明的实体,块范围声明   声明该实体并接收先前声明的链接。如果不止一个这样的话   匹配实体,该程序是不正确的。否则,如果未找到匹配的实体,则为块范围实体   接受外部联系。

因此,使用和不使用external的块作用域函数声明之间没有区别。但请注意有趣的例子:

static void f();

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

此处,块范围f重新声明::f并接收其相同的链接:internal。即使它标记为extern。但缺少extern关键字的存在并不重要

答案 1 :(得分:1)

函数是否具有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 )