2013-02-27 53 views
0

我有這兩個命名空間,每一個包含具有相同名稱的功能,如導出功能重複在兩個命名空間(C++)

namespace group1 { 
    void add(int arg) { 
    } 
} 

namespace group2 { 
    void add(bool arg) { 
    } 
} 

和我聲明指定此在頭

#ifdef __cplusplus 
    extern "C" { 
#endif 
    // My namespaces and functions prototypes here 
#ifdef __cplusplus 
    } 
#endif 

,我試圖將其導出到一個DLL,與海灣合作委員會。我得到了關於它們之間的衝突的警告,因爲它們具有相同的名稱,然後在鏈接時發生錯誤。我認爲這個名字也是基於參數在目標文件中被破壞的。我不知道鏈接器是否也關心命名空間。我怎麼能做這個工作?謝謝。

回答

2

如果這些都是C++函數,你必須刪除extern "C"包圍:

#ifdef __cplusplus 
    extern "C" { 
#endif 

#ifdef __cplusplus  
    } 
#endif 

extern "C"告訴編譯器「不裂傷這個名字」 - 但(像你說的),你想要的是混淆。

+0

謝謝。我錯了。我希望所有這些都是C++,我甚至不知道爲什麼我將它導出爲C. – ali 2013-02-27 20:21:58

2

你不能真正做到這一點直接。當您使用extern "C",你宣稱,好像他們是C函數,而不是C++的功能被導出。

這意味着(除其他事項外)

  1. 命名空間被刪除,並且不被認爲是名字
  2. 沒有名字的參數重整,由於是做

您可以將最好的一部分do是創建重定向的extern「C」函數。

#ifdef __cplusplus 
    extern "C" { 
#endif 
    void group1_add(int arg); 
    void group2_add(bool arg); 
#ifdef __cplusplus 
    } 
#endif 

然後的包裝器函數的實現會使用任一group1::add()group2::add()適當。