Sí, tienes suerte :) La "C" externa es un enlace de lenguaje para el lenguaje C que cada compilador de C++ tiene que soportar, además de extern "C++" que es el predeterminado. Los compiladores pueden ser compatibles con otros enlaces de idiomas. GCC, por ejemplo, admite "Java" externo, que permite la interfaz con el código Java (aunque eso es bastante engorroso).
extern "C" le dice al compilador que su función es invocable por código C. Eso puede, pero no debe, incluir la convención de llamadas apropiada y el cambio de nombre de lenguaje C apropiado (a veces llamado "decoración"), entre otras cosas, dependiendo de la implementación. Si tiene una función miembro estática, la convención de llamada es la de su compilador C++. A menudo son los mismos que para el compilador de C de esa plataforma, así que dije que tienes suerte. Si usted tiene una API C y se pasa un puntero de función, mejor siempre poner uno a una función declarada con extern "C" como
extern "C" void foo() { ... }
A pesar de que el tipo de puntero de función no contiene la especificación de vinculación, sino más bien se parece a
void(*)(void)
la vinculación es una parte integral del tipo - que no se puede expresar directamente sin un typedef:
compilador
extern "C" typedef void(*extern_c_funptr_t)();
el Comeau C++, en modo estricto , emitirá un error, por ejemplo, si intenta asignar la dirección de la función externa "C" de arriba a (void(*)())
, ya que este es un puntero a una función con enlace C++.
'Lo siento, pero todavía no estoy convencido' ... ¿de qué? el hecho de que el estándar es más autoritativo que el comportamiento coincidente de implementación definida de algunos compiladores? –
Esta es una publicación anterior (hace 8 años) Mi punto era en ese momento algo así como mi humilde opinión, si cada implementación existente difiere del estándar, entonces tal vez debería preguntarse si es el estándar el que está mal. Estaba buscando ejemplos de plataformas donde no funciona. –
Bastante justo.Por supuesto, no es raro que los estándares C o C++ contengan consecuencias imprevistas que todos los compiladores ignoran. Este es mi favorito en este momento: http://stackoverflow.com/a/42335543/2757035 Pero en este caso, creo que el estándar está diciendo claramente lo que significa, y las implementaciones pueden cambiar su comportamiento en cualquier momento si hay alguna ventaja. –