假設我有不同的命名空間 ,如apple命名空間和橙色命名空間,但兩個命名空間都包含一個名爲myfunction()的函數。不同命名空間中的相同函數名稱
當我在main()中調用myfunction()時會發生什麼?
假設我有不同的命名空間 ,如apple命名空間和橙色命名空間,但兩個命名空間都包含一個名爲myfunction()的函數。不同命名空間中的相同函數名稱
當我在main()中調用myfunction()時會發生什麼?
這正是引入的命名空間。
在你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
的兩個版本都在範圍內,則最後一行將再次產生錯誤,因爲在這種情況下,您必須指定必須調用哪個函數。
考慮下面的例子。
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進行實驗,如果您對內部工作感興趣。
請注意,標準沒有指定任何名稱混搭風格,也沒有實際提及它,據我所知。你的例子對於G ++來說是正確的,但MSVC的做法是不同的,我想英特爾會以另一種方式來做。用例子舉例說明是很好的,但是應該清楚,當這些例子不是可移植的,也不是標準的時候,你不能依賴這種行爲,因爲它是由實現定義的。 – Elkvis
是的。埃爾維斯謝謝指出。範圍映射是實現定義的,並隨編譯器而變化。例子是說明作用域內的作用域和函數是如何相互關聯的。當然,** NameLookUp **算法的變化,可能是簡單的表格!但最終我們正在尋找似乎具有相同名稱的功能。並且很容易通過clang學習這個概念,因此最後提示:) –
完全是OT,但是不應該「Soron」是「Sauron」? –
很可能找不到該名稱,代碼將無法編譯。但可能會發布一些示例代碼,因爲細節很重要。 – juanchopanza
使用您想要的名稱空間限定函數調用,即apply :: myfunction()或orange :: myfunction() – acraig5075