2015-07-21 294 views
8

假設我有不同的命名空間 ,如apple命名空間和橙色命名空間,但兩個命名空間都包含一個名爲myfunction()的函數。不同命名空間中的相同函數名稱

當我在main()中調用myfunction()時會發生什麼?

+7

很可能找不到該名稱,代碼將無法編譯。但可能會發布一些示例代碼,因爲細節很重要。 – juanchopanza

+0

使用您想要的名稱空間限定函數調用,即apply :: myfunction()或orange :: myfunction() – acraig5075

回答

22

這正是引入的命名空間。

在你main(),或一般在全局命名空間,您將能夠選擇至極myfunctions也被稱爲:

int main() 
{ 
    apple::myfunction(); // call the version into the apple namespace 
    orange::myfunction(); // call the orange one 
    myfunction(); // error: there is no using declaration/directive 
} 

在使用指令(using namespace apple)一的情況下,或一個使用聲明using apple::myfunction),主的最後一行將調用命名空間apple內的版本。如果myfunction的兩個版本都在範圍內,則最後一行將再次產生錯誤,因爲在這種情況下,您必須指定必須調用哪個函數。

+0

如果您使用類似'using namespace apple' *和*'using namespace orange'的東西?我猜這是完整答案的最後一件事。 – Timo

+0

@Timo在這種情況下,調用是不明確的,編譯器必須拒絕它。 –

+0

即編譯器錯誤? – Timo

5

考慮下面的例子。

namespace Gandalf{ 

    namespace Frodo{ 
     bool static hasMyPrecious(){ // _ZN7Gandalf5FrodoL13hasMyPreciousEv 
      return true; 
     } 
    }; 

    bool static hasMyPrecious(){ // _ZN7GandalfL13hasMyPreciousEv 
     return true; 
    } 
}; 

namespace Sauron{ 
    bool static hasMyPrecious(){ // _ZN5SauronL13hasMyPreciousEv 
     return true; 
    } 
}; 

bool hasMyPrecious(){ // _Z13hasMyPreciousv 
    return true; 
} 

int main() 
{ 
    if(Gandalf::Frodo::hasMyPrecious() || // _ZN7Gandalf5FrodoL13hasMyPreciousEv 
     Gandalf::hasMyPrecious()  || // _ZN7GandalfL13hasMyPreciousEv 
     Sauron::hasMyPrecious()   || // _ZN5SauronL13hasMyPreciousEv 
     hasMyPrecious()) // _Z13hasMyPreciousv 
     return 0; 

    return 1; 
} 

按照其功能聲明命名空間,編譯器會生成一個名爲重整名稱每個函數,它只不過是名字空間範圍的編碼,其中定義函數,函數名,返回類型和實際參數的唯一標識。看評論。在您創建對此函數的調用時,每個函數調用都會查找相同的受到破壞的簽名,如果找不到,則編譯器會報告錯誤。

嘗試使用clang -emit-llvm -S -c main.cpp -o main.ll進行實驗,如果您對內部工作感興趣。

+2

請注意,標準沒有指定任何名稱混搭風格,也沒有實際提及它,據我所知。你的例子對於G ++來說是正確的,但MSVC的做法是不同的,我想英特爾會以另一種方式來做。用例子舉例說明是很好的,但是應該清楚,當這些例子不是可移植的,也不是標準的時候,你不能依賴這種行爲,因爲它是由實現定義的。 – Elkvis

+0

是的。埃爾維斯謝謝指出。範圍映射是實現定義的,並隨編譯器而變化。例子是說明作用域內的作用域和函數是如何相互關聯的。當然,** NameLookUp **算法的變化,可能是簡單的表格!但最終我們正在尋找似乎具有相同名稱的功能。並且很容易通過clang學習這個概念,因此最後提示:) –

+1

完全是OT,但是不應該「Soron」是「Sauron」? –

相關問題