Только что я пришел к выводу, что стандарт С++ говорит, что функции C и С++ имеют разные и несовместимые типы, даже если их сигнатуры типов одинаковы (подробнее см. this вопрос). Это означает, что вам технически не разрешено передавать С++-функцию функции C, например pthread_create()
.
Мне любопытно, есть ли какие-либо используемые платформы, где два ABI на самом деле отличаются (помимо очевидных отличий от названия). В частности, знает ли кто-нибудь о каких-либо платформах, на которых эта программа на С++ не сможет скомпилировать и запустить?
#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;
}