2012-02-29 24 views
6

Perché non è necessario specificare extern "C" per una funzione che deve essere definita come una funzione C? Quale effetto avrebbe sul compilatore durante la compilazione del file come sorgente C?Possiamo usare "C" extern nel file C senza #ifdef __cplusplus?

Se non c'è alcun effetto sul compilatore C, non possiamo semplicemente definire una funzione in un file di intestazione come di seguito rimuovendo il controllo #ifdef __cplusplus?

extern "C" { 
    int MyFunc(); 
} 

An answer to another question dice che il #ifdef è necessario, ma non capisco il motivo per cui:

Per quanto riguarda # 2: sarà definito __cplusplus per qualsiasi unità di compilazione che viene eseguito attraverso il C++ compiler. In genere, ciò significa file .cpp e qualsiasi file incluso da quel file .cpp. Lo stesso file .h (o .hh o .hpp o what-have-you) potrebbe essere interpretato come C o C++ in momenti diversi, se diverse unità di compilazione li includono. Se si desidera che i prototipi nel file .h facciano riferimento ai nomi dei simboli C, devono avere extern "C" quando vengono interpretati come C++ e non dovrebbero avere extern "C" quando vengono interpretati come C - da cui il controllo #ifdef __cplusplus.

risposta

13

Il costrutto extern "C" è un costrutto C++ e non è riconosciuto da un compilatore C. In genere, emetterà un messaggio di errore di sintassi.

Un trucco comune consiste nel definire una macro, ad esempio EXTERN_C, che si espanderebbe in qualcosa di diverso a seconda che si compilasse utilizzando C o C++. Per esempio:

In un file di intestazione comune:

#ifdef __cplusplus 
#define EXTERN_C extern "C" { 
#define EXTERN_C_END } 
#else 
#define EXTERN_C 
#define EXTERN_C_END 
#endif 

In altri file:

EXTERN_C 
int MyFunc(void); 
EXTERN_C_END 
+1

Grazie. Non sapevo che fosse un costrutto C++. – Alexander

2

Se si compila un file sorgente C, sarà non riconoscere extern "C", e sarebbe di solito provocano un errore di compilazione.

Se si compila un file sorgente come C++, lo sarà riconoscendo extern "C" ei nomi corretti saranno collegati.

Pertanto, è possibile utilizzarlo in modo affidabile solo per specificare i nomi dei simboli C per i file compilati come C++.

Se si compilano sorgenti come C e C++ o le proprie interfacce sono destinate ai client C e C++, è necessario specificare questo in un modo o nell'altro in modo che i client ottengano i simboli corretti durante il collegamento (e così via).

Correlati: È autorizzato a scrivere extern "C++" - per le traduzioni C++.

Problemi correlati