3 回答

TA貢獻1847條經(jīng)驗 獲得超7個贊
除了上面的所有答案。
內(nèi)聯(lián)命名空間可用于編碼符號中的ABI信息或函數(shù)版本。正是由于這個原因,它們被用于提供后向ABI兼容性。內(nèi)聯(lián)命名空間允許您在不更改API的情況下將信息注入到損壞的名稱(ABI)中,因為它們僅影響鏈接器符號名稱。
考慮這個例子:
假設您編寫了Foo
一個引用對象的函數(shù),bar
并且不返回任何內(nèi)容。
在main.cpp中說
struct bar;void Foo(bar& ref);
如果在將文件編譯為對象后檢查此文件的符號名稱。
$ nm main.o T__ Z1fooRK6bar
鏈接器符號名稱可能會有所不同,但它肯定會在某處編碼函數(shù)和參數(shù)類型的名稱。
現(xiàn)在,它可能被bar
定義為:
struct bar{ int x;#ifndef NDEBUG int y;#endif};
根據(jù)構建類型,bar
可以引用具有相同鏈接器符號的兩種不同類型/布局。
為了防止這種行為,我們將結構包裝bar
到一個內(nèi)聯(lián)命名空間中,根據(jù)Build類型,鏈接器符號bar
將是不同的。
所以,我們可以寫:
#ifndef NDEBUGinline namespace rel { #elseinline namespace dbg {#endifstruct bar{ int x;#ifndef NDEBUG int y;#endif};}
現(xiàn)在,如果您查看每個對象的目標文件,您可以使用release構建一個,另一個使用debug flag。您會發(fā)現(xiàn)鏈接器符號也包含內(nèi)聯(lián)命名空間名稱。在這種情況下
$ nm rel.o T__ ZROKfoo9relEbar$ nm dbg.o T__ ZROKfoo9dbgEbar
鏈接器符號名稱可能不同。
注意符號名稱的存在rel
和dbg
符號名稱。
現(xiàn)在,如果您嘗試將調試與發(fā)布模式鏈接或反之亦然,則會出現(xiàn)鏈接器錯誤,這與運行時錯誤相反。
- 3 回答
- 0 關注
- 869 瀏覽
添加回答
舉報