2016-07-26 71 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