次のコードは、私が遭遇した状況を説明しています。
#ifdef __cplusplus
namespace ns
{
class pod
{
const short foo;
const char bar;
public:
pod(short f,char b):foo(f),bar(b){}
char foobar();
};
}
#else
typedef struct pod pod;
#endif
#ifdef __cplusplus
extern "C"{
#endif
extern pod* pod_new(short f, char b);//BANG!!!
extern char pod_foobar(pod* p); //BANG!!!
#ifdef __cplusplus
}
#endif
C リンケージ関数を名前空間内に配置できないns
か、C クライアントがそれらの定義を見つけられません。それらを名前空間から引き出すと、C++ 定義もコンパイルされません。これはすべて、C++ FAQ Litepod
から学んだ解決策のためです。これはプリプロセッサのトリックにすぎません。そして悲しいことに、このトリックは名前空間を扱うことができませんでした。
私はどうしたらいいですか?タイプセーフをすべて破棄pod*
してに置き換えるvoid*
必要がありますか、またはこのような状況に対するより良い解決策はありますか? 何かアドバイスはありますか?お願いします!