Desde el proyecto de C++ 11, 7.5 (párrafo 1).:¿Las funciones "C" externas son un tipo separado?
dos tipos de eventos de diferentes idioma vínculos son tipos distintos, incluso si son de otro modo idénticas.
Así que puedo hacer sobrecarga basado en vínculos de idioma:
extern "C" typedef void (*c_function)();
typedef void (*cpp_function)();
void call_fun(c_function f)
{
}
void call_fun(cpp_function f)
{
}
extern "C" void my_c()
{
}
void my_cpp()
{
}
int main()
{
call_fun(my_c);
call_fun(my_cpp);
}
Pero, con GCC 4.7.1 este código de ejemplo da los mensajes de error:
test.cpp: In function 'void call_fun(cpp_function)':
test.cpp:7:6: error: redefinition of 'void call_fun(cpp_function)'
test.cpp:4:6: error: 'void call_fun(c_function)' previously defined here
Y con CLANG ++:
test.cpp:7:6: error: redefinition of 'call_fun'
void call_fun(cpp_function f)
^
test.cpp:4:6: note: previous definition is here
void call_fun(c_function f)
^
Ahora las preguntas:
¿Mi comprensión de la norma es correcta? ¿Es este código válido?
¿Alguien sabe si estos son errores en los compiladores o si intencionalmente lo hacen de esa manera por razones de compatibilidad?
Sólo para que conste: el estándar de C++ 03 tiene exactamente la misma frase en el mismo párrafo, por lo que este no se trata de una característica de C++ 11 aún no admitida por los compiladores. – Gorpik
Ver http://stackoverflow.com/a/10643935/1463922. Asegúrese de que las convenciones de llamadas de C y C++ coincidan. – PiotrNycz