0

これらの 2 つの名前空間があり、それぞれに同じ名前の関数が含まれています。

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

GCCを使用して、それらをDLLにエクスポートしようとしています。それらは同じ名前であるため、それらの間の競合に関する警告が表示され、リンク時にエラーが発生します。名前も引数に基づいてオブジェクトファイルでマングルされていると思いました。リンカーが名前空間も気にするかどうかはわかりません。どうすればこれを機能させることができますか?ありがとう。

4

2 に答える 2

2

あなたは本当にそれを直接行うことはできません。を使用するextern "C"と、関数が C++ ではなく C 関数であるかのようにエクスポートされることを宣言します。

これは(とりわけ)を意味します

  1. 名前空間は削除され、名前の一部とは見なされません
  2. 引数による名前マングリングは行われません

あなたができる最善のことは、リダイレクトする extern "C" 関数を作成することです。

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

そして、ラッパー関数の実装は、必要に応じてgroup1::add()またはを使用group2::add()します。

于 2013-02-27T20:16:51.650 に答える
2

これらが C++ 関数の場合、extern "C"括弧を削除する必要があります。

#ifdef __cplusplus 
    extern "C" {
#endif

#ifdef __cplusplus 
    }
#endif

extern "C"コンパイラに「この名前をマングルしないでください」と伝えますが、(あなたが言うように)マングルが必要です。

于 2013-02-27T20:18:17.690 に答える