私はそのような例をBoostコードで見つけます。
namespace boost {
namespace {
extern "C" void *thread_proxy(void *f)
{
....
}
} // anonymous
void thread::thread_start(...)
{
...
pthread_create(something,0,&thread_proxy,something_else);
...
}
} // boost
なぜ実際にこれが必要なのextern "C"
ですか?
関数がプライベート内部であることは明らかであり、thread_proxy
実際にはマングルする必要がまったくないため、「thread_proxy」としてマングルされることはないと思います。
実際、私が作成し、多くのプラットフォームで実行されるすべてのコードで、使用extern "C"
したことはなく、これは通常の関数でそのまま機能していました。
なぜextern "C"
追加されるのですか?
私の問題は、extern "C"
関数がグローバル名前空間を汚染し、作成者が期待するように実際には隠されていないことです。
これは重複ではありません! 私はマングリングと外部リンケージについて話しているのではありません。このコードでは、外部リンケージが不要であることは明らかです。
回答: C関数とC ++関数の呼び出し規約は必ずしも同じではないため、Cの呼び出し規約を使用して作成する必要があります。C ++標準の7.5(p4)を参照してください。