2012-03-13 91 views
16

我必須鏈接兩個庫,稱爲A和B.一些文件在兩個庫中都是通用的。 因此,我在庫A中聲明瞭一個名稱空間內的函數,比如說abc。 所以,在A和B,一個函數func看起來象下面這樣:C++:命名空間中的Extern C函數

[ in A] 

    namespace abc { 
    extern "C" void func(); 
    } 


[in B] 

    extern "C" void func(); 

在構建項目,編譯器會引發鏈接錯誤說法函數func的多個定義。不是名稱空間中的函數func或者是否存在extern「C」函數的問題。如果有,那我怎樣才能區分它們呢?

回答

23

當您使用Extern「C」時,您將關閉名稱修改,因此您將丟失名稱空間信息,因爲C沒有這樣的概念。這會導致重複的定義。

+1

但是,請注意,對於C預處理器,可能未關閉名稱修改。在Visual C++ 2010中,'__FUNCTION__'宏的值仍然是完全限定的標識符,即使在'extern「C」',例如。 「你的名字」。在調用使用預定義宏如'__FUNCTION__','__PRETTY_FUNCTION__'或'__func__'的命名空間中的宏時,在我的情況下(從DLL導出C存根)它確實;-) – 2012-05-03 09:42:36