significado nombre application c++ c abi

nombre - ¿Qué plataformas tienen ABIs incompatibles para C y C++?



abi significado (1)

No conozco ninguna plataforma en la que la ABI sea diferente, pero incluso si las convenciones de llamada de C y C ++ son las mismas, el estándar de C ++ requiere que el compilador emita un diagnóstico para el programa. Un enlace de puntero a función con lenguaje C es un tipo diferente a un enlace de puntero a función con C ++ - lenguaje, por lo que debería ser capaz de sobrecargar run() manera:

extern "C" int run(int (*f)(int), int x) { return f(x); } extern "C++" int run(int (*f)(int), int x) { return f(x); }

Ahora, cuando llama a run(times) , debería llamar a la segunda, de modo que se deduce que la primera no es invocable (no hay conversión del enlace puntero a función con lenguaje C a un enlace puntero a lenguaje). function-with-C ++ - language-linkage) y por lo tanto el código original debería causar un diagnóstico del compilador. Sin embargo, la mayoría de los compiladores se equivocan, por ejemplo, http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2316

NB: El compilador de Solaris diagnostica los enlaces de idioma incompatibles, como una advertencia:

"tc", line 11: Warning (Anachronism): Formal argument f of type extern "C" int(*)(int) in call to run(extern "C" int(*)(int), int) is being passed int(*)(int).

Si sobrecargas la run con una función extern "C++" , se llama correctamente a la extern "C++" una para run(times) .

Acabo de recordar que el estándar de C ++ dice que las funciones de C y C ++ tienen tipos diferentes e incompatibles, incluso si sus firmas de tipo son las mismas (para más información, consulte esta pregunta ). Eso significa que técnicamente no se le permite pasar una función de C ++ a una función de C como pthread_create() .

Tengo curiosidad por saber si hay alguna plataforma en uso en la que las dos ABI sean realmente diferentes (aparte de las obvias diferencias de nombre). Específicamente, ¿alguien sabe de alguna plataforma en la que este programa C ++ no pueda compilarse y ejecutarse?

#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(&times2, argc); assert(a == b); return a; }