我刚刚注意到 C++ 标准说 C 和 C++ 函数具有不同且不兼容的类型,即使它们的类型签名相同(有关更多信息,请参阅此问题)。这意味着从技术上讲,您不允许将 C++ 函数传递给 C 函数,例如pthread_create()
.
我很好奇是否有任何平台在使用,其中两个 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;
}