dll匯出命名空間下的c風格函式陷阱

2022-04-30 23:30:20 字數 778 閱讀 5653

1、編譯階段,如果不是過載,那麼c風格的同名函式與c++風格的同名函式,就會報編譯錯誤。

error c2084: function 'int test(void)' already has a body。

2、編譯期間,編譯器會檢查命名空間裡的函式。如sg::test();

編譯器會檢測是否有函式test()在sg命名空間裡。如果沒有就會報錯。

error c2039: 'test' : is not a member of 'sg' 

3、鏈結階段,當命名空間與extern 「c」組合在一起時,生成的函式**其實是c風格的,沒有命名空間修飾。

這是因為c風格裡函式裡沒有命名空間這一概念,所以命名空間自動會被鏈結器忽略。

基於以上的原則,編譯器鏈結器能夠識別出基本所有的錯誤用法。

但是有一種情況,編譯器鏈結器都無法識別。

那就是dlla中有命名空間

namespace sg1

dllb中有命名空間sg2::test()匯出函式。

namespace sg2

在exe中呼叫sg2::test()。 這個時候,編譯鏈結都是正確的。 但是實際執行的時候,卻隱藏著乙個隱患。 因為實際生成的彙編**直接是

004ef8ff ff 15 18 1a 78 00 call  dword ptr [__imp__test (781a18h)] 

和命名空間無關。 那麼彙編**會呼叫sg1下的還是sg2下的test呢? 這兩個dll誰先引用進到exe,先呼叫誰。

c 命名空間 dll 與函式

是對類的封裝,類似c 的namespace。c 中沒有標頭檔案與巨集定義。若將乙個類prog包含在命名空間a中,那麼該類的完全限定名為a.prog。using system using system.collections.generic using system.linq using system...

c 中regex的命名空間 c 命名空間

system.transactions 命名空間 注意 此命名空間在 net framework 2.0 版中是新增的。使用 system.transactions 命名空間包含的類可以編寫自己的事務應用程式和資源管理器。具體地說,可以建立和參與 與乙個或多個參與者 本地或分布式事務。system....

C 的命名空間

1 命名空間的由來 乙個程式由多個模組組成,而不同的模組中全域性變數名或函式名相同的問題不可避免,這將會產生鏈結錯誤。c 中引入命名空間的概念就是為了解決名稱衝突問題。2 命名空間的本質 個人觀點 乙個命名空間是乙個作用域,使用它來宣告一批名稱 變數名,類名,函式名 來自該空間,以唯一地確定這些名稱...