Po prostu przyszło mi do głowy, że standard C++ mówi, że funkcje C i C++ mają różne i niekompatybilne typy, nawet jeśli ich sygnatury są takie same (więcej informacji można znaleźć w artykule this question). Oznacza to, że technicznie nie można przekazać funkcji C++ do funkcji C, takiej jak pthread_create()
.Jakie platformy mają niekompatybilne ABI dla C i C++?
Jestem ciekawy, czy są jakieś platformy w użyciu, gdzie dwa ABI są w rzeczywistości różne (poza oczywistymi różnicami w mangowaniu nazwy). Mówiąc konkretnie, czy ktoś wie o platformach, na których programowi C++ nie uda się skompilować i uruchomić?
#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;
}
'extern" C "' funkcje mogą przyjmować typy C++ (takie jak instancje klasy) jako argumenty, chociaż prawda? Nie sądzę, że "extern" C "' sprawia, że parametry funkcji są magicznie "nie-C++". –
Być może rzeczy takie jak endianness mogą się różnić dla danego systemu między C i C++? To jedyna rzecz, o której teraz mogę myśleć. –
@SethCarnegie: Myślę, że problem polega właśnie na tym, że C++ mówi, że wskaźniki funkcji C i C++ są różnymi typami. Ponieważ nie można wywołać funkcji za pomocą wskaźnika, którego typ jest inny niż zadeklarowany typ, uważam, że wynika z tego, że nie można wywołać funkcji C++ za pomocą wskaźnika "extern C". Chcę się mylić, ale wydaje się, że istnieje zgoda co do tego (zobacz link zamieszczony w pytaniu). –