Sì, sei solo fortunato :) L'extern "C" è un collegamento linguistico per il linguaggio C che ogni compilatore C++ deve supportare, oltre a extern "C++" che è l'impostazione predefinita. I compilatori possono supportare altri collegamenti linguistici. GCC ad esempio supporta extern "Java" che consente l'interfacciamento con il codice java (anche se è piuttosto ingombrante).
extern "C" indica al compilatore che la funzione è richiamabile dal codice C. Ciò può, ma non deve, includere la convenzione di chiamata appropriata e il nome appropriato del linguaggio c mangling (a volte chiamato "decorazione"), tra le altre cose, a seconda dell'implementazione. Se si dispone di una funzione membro statica, la convenzione di chiamata per esso è quella del compilatore C++. Spesso sono gli stessi del compilatore C di quella piattaforma - quindi ho detto che sei solo fortunato. Se si dispone di un'API C e si passa un puntatore a funzione, sempre meglio mettere uno a una funzione dichiarata con extern "C" come
extern "C" void foo() { ... }
Anche se il tipo di puntatore a funzione non contiene la specifica di collegamento, ma piuttosto sembra
void(*)(void)
il collegamento è parte integrante del tipo - non si può esprimere direttamente senza un typedef:
extern "C" typedef void(*extern_c_funptr_t)();
il Comeau C++, in modalità rigorosa , ad esempio, si emetterà un errore se si tenta di assegnare l'indirizzo della funzione "C" extern di sopra a (void(*)())
, beause questo è un puntatore a una funzione con collegamento C++.
fonte
2009-02-26 20:06:24
'Mi dispiace, ma non sono ancora convinto '... di cosa? il fatto che lo standard sia più autorevole rispetto al comportamento definito dall'implementazione casuale di alcuni compilatori? –
Questo è un vecchio post (8 anni fa oggi) Il mio punto era al momento qualcosa come IMHO se ogni implementazione esistente differisce dallo standard quindi forse dovresti fare una domanda sul fatto che sia lo standard che è sbagliato. Stavo cercando esempi di piattaforme in cui non funziona. –
Abbastanza giusto.Ovviamente non è inaudito che gli standard C o C++ contengano conseguenze indesiderate ignorate da tutti i compilatori esistenti. Questo è il mio preferito al momento: http://stackoverflow.com/a/42335543/2757035 Ma in questo caso, penso che lo Standard stia dicendo chiaramente cosa significa, e le implementazioni potrebbero cambiare il loro comportamento in qualsiasi momento se c'è qualche vantaggio –