Domanda

Perché non extern "C" essere specificato per una funzione che deve essere definito come una funzione C?Che effetto vorresti che il compilatore durante la compilazione del file di origine C?

Se non vi è alcun effetto sul compilatore C, non si può proprio definire una funzione in un file di intestazione, come di seguito rimuovendo l' #ifdef __cplusplus di controllo?

extern "C" {
    int MyFunc();
}

Una risposta a un'altra domanda dice che il #ifdef è necessaria, ma non capisco perché:

Per quanto riguarda #2:__cplusplus saranno definite per ogni unità di compilazione, che viene eseguito attraverso il compilatore C++.Generalmente, questo significa che .i file cpp e qualsiasi file che vengono inclusi da che .file cpp.Stesso .h (o .hh .hpp o che cosa-voi) potrebbe essere interpretato come il C o il C++ in tempi diversi, e diverse compilation unità sono dotate di loro.Se si desidera che i prototipi .h file per fare riferimento a C i nomi dei simboli, quindi devono avere extern "C" quando viene interpretata come il C++, e non dovrebbero avere extern "C" quando essere interpretato come C-quindi #ifdef __cplusplus la verifica.

È stato utile?

Soluzione

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

Un trucco comune è quello di definire una macro, per esempio EXTERN_C, che si espande in una cosa diversa, a seconda se si compila utilizzando il C o il C++.Per esempio:

In un comune file di intestazione:

#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

Altri suggerimenti

Se si compila un file sorgente C, si non riconoscere extern "C", e di solito generato un errore di compilazione.

Se si compila un file sorgente C++, sarà riconoscere extern "C", e i nomi corretti saranno collegati.

Pertanto, si può usare solo in modo affidabile per specificare simbolo C e nomi di file compilato come C++.

Se si compilare i sorgenti come C e C++, o le interfacce sono destinati per C e C++ clienti, è necessario specificare questo, in un modo o in un altro ordine per i vostri clienti a ottenere i simboli corretti quando il collegamento (e così via).

Related:Si sono permesso di scrivere extern "C++" - per C++ traduzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top