C++ 標準では、型シグネチャが同じであっても、C 関数と C++ 関数には異なる型と互換性のない型があると記載されていることに気付きました (詳細については、この質問を参照してください)。つまり、技術的には、C++ 関数を のような C 関数に渡すことは許可されていませんpthread_create()
。
2 つの ABI が実際に異なるプラットフォームが使用されているかどうか (明らかな名前マングリングの違いは別として) 興味があります。具体的には、この C++ プログラムがコンパイルおよび実行に失敗するプラットフォームを知っている人はいますか?
#include <assert.h>
extern "C" int run(int (*f)(int), int x) { return f(x); }
int times2(int x) { return x * 2; }
int main(int argc, char *argv[]) {
int a = times2(argc);
// This is undefined behavior according to C++ because I am passing an
// "extern C++" function pointer to an "extern C" function.
int b = run(×2, argc);
assert(a == b);
return a;
}