簡體   English   中英

為什么名稱修改沒有標准化

[英]Why is name mangling not standardized

我只是想知道為什么名稱修改從未被 C++ 標准標准化。 顯然,使用不同的名稱修改算法會損害互操作性 [1],而且我認為實現定義它沒有任何好處。

也就是說,與調用約定或原語大小相反,機器本身並不關心甚至不知道函數是如何調用的。 那么為什么它沒有標准化,為什么它仍然沒有標准化? 無論如何,編譯器過去在版本之間改變了規則。

[1] 所有將函數導出為extern "C"都說得過去。

該標准不涉及實施細節。 有很多很多事情依賴於實現,並且會阻止程序一起工作:類的布局方式、 vtable的結構等。 一般來說,如果編譯器更改其中任何一項,編譯器將更改名稱重整. 這是有意為之,因為它可以防止鏈接不起作用的代碼。

給定平台可以定義 C++ ABI; 遵守它的所有編譯器都將使用兼容的實現,並具有通用名稱修改。 然而,這對平台供應商來說是一個問題; 無論出於何種原因,很少有供應商定義了 C++ ABI。

extern "C"起作用的原因是幾乎所有平台都定義了 C ABI。

該標准實際上並不需要名稱修改。 就此而言,該標准不需要 IEEE 浮點數或任何數量的其他東西。

在出現可以依賴的廣泛 ABI 之前, GCC 實際上特意使用了與其競爭對手不同的名稱修改方案

G++ 不像其他 C++ 編譯器那樣進行名稱修改。 這意味着用一個編譯器編譯的目標文件不能與另一個編譯器一起使用。

這種效果是有意為之,以保護您免受更微妙的問題的困擾。 編譯器在 C++ 實現的許多內部細節方面有所不同,包括:類實例的布局方式、多重繼承的實現方式以及虛函數調用的處理方式。 如果名稱編碼相同,您的程序將鏈接到其他編譯器提供的庫——但程序會在運行時崩潰。 然后在鏈接時而不是在運行時檢測不兼容的庫。

名稱修改也比許多程序員意識到的要復雜。 例如,標准如何為 C++ 可以運行的所有平台指定可接受的調用約定 即使 RISC 系統通常在寄存器而不是堆棧中傳遞參數,是否應該要求 RISC 系統支持 x86 stdcall

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM