Dalla C++ 11 progetto, 7.5 (paragrafo 1.):La "C" esterna è di tipo separato?
Due tipi di funzione con lingua diversa legami sono tipi distinti anche se sono altrimenti identici.
così posso fare il sovraccarico sulla base di legami linguistici:
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);
}
Ma, con GCC 4.7.1 questo codice di esempio dà i messaggi di errore:
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
E con clangore ++:
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)
^
Ora le domande:
La mia comprensione dello standard è corretta? Questo codice è valido?
Qualcuno sa se questi sono errori nei compilatori o se lo fanno intenzionalmente in questo modo per motivi di compatibilità?
Tanto per la cronaca: lo standard C++ 03 ha esattamente la stessa frase nello stesso paragrafo, quindi questo non è una questione di una funzione di C++ 11 non ancora supportata dai compilatori. – Gorpik
Vedere http://stackoverflow.com/a/10643935/1463922. Assicurarsi che le convenzioni di chiamata di C e C++ corrispondano. – PiotrNycz