似乎在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();
}
}
谢谢!
答案 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 )