2016-07-26 32 views
2

看起来在C++ extern(NOT后跟一个语言链接字符串文字)在名称空间范围(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

为什么要在函数内声明一个函数?你认为它有什么作用? –

+0

与extern相反的是static - 'static void g(); //内部联动“。 –

+0

@underscore_d检出http://stackoverflow.com/questions/1034606/is-there-any-use-for-local-function-declarations – EulersRainbow

回答

2

的规定在这里从何而来[ basic.link]:

在块范围中声明的函数的名称和由块范围声明的变量的名称extern 声明有联系。如果对具有相同名称和类型的链接的实体进行可见声明,则忽略在最内层封闭名称空间范围外声明的实体,块范围声明 声明同一个实体并接收前一个声明的链接。如果有多于一个这样的匹配实体,则该程序是格式不正确的。否则,如果找不到匹配的实体,则块范围实体 接收外部链接。

因此,在有和没有external的块范围函数声明之间没有区别。但需要注意的有趣的例子:

static void f(); 

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

这里,块范围f redeclares ::f并接收其相同的链接:内部。尽管它标记为extern。但extern关键字的缺席的存在并不重要

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) 
+0

我觉得这个回答强调了局部函数声明的使用,而不仅仅是回答是否有任何场景函数声明中存在或不存在extern的问题。或者我错过了什么?此外,任何对C++标准的引用都将被赞赏。谢谢! – EulersRainbow

+0

@EulersRainbow当名称解析为ambiguios时,在函数声明和某个库中的同名函数声明之间存在冲突时,可以使用局部声明。至于对标准的提及,不幸的是我没有手工拷贝标准或草案。 –

+0

谢谢。我想我明白他们的好处 - 你的榜样在突出地方声明的好处方面做得很好。但是我更感兴趣的问题是:基于C++标准,如果我在本地函数声明中添加'extern',它们真的没有区别吗? – EulersRainbow