Sto lavorando a un progetto che contiene molto codice C. Abbiamo iniziato a scrivere in C++, con l'intento di convertire anche il codice legacy. Sono un po 'confuso su come interagiscono il C e il C++. Comprendo che, inserendo il codice C con extern "C"
, il compilatore C++ non manipolerà i nomi del codice C, ma non sono completamente sicuro di come implementarlo.Combinare C++ e C - come funziona #ifdef __cplusplus?
Così, nella parte superiore di ogni C file di di intestazione (dopo l'inclusione guardie), abbiamo
#ifdef __cplusplus
extern "C" {
#endif
e in fondo, scriviamo
#ifdef __cplusplus
}
#endif
tra i due , abbiamo tutti i nostri inclusi, typedef e prototipi di funzioni. Ho un paio di domande, per vedere se sto capire questo correttamente:
Se ho un C++ il file A.hh che include un C file di intestazione Bh, include un altro C intestazione file Ch, come funziona? Credo che quando i passaggi compilatore in B.h, saranno definiti
__cplusplus
, quindi sarà avvolgere il codice conextern "C"
(e__cplusplus
non saranno definita all'interno di questo blocco). Quindi, quando entra in C.h,__cplusplus
non sarà definito e il codice non verrà incapsulato inextern "C"
. È corretto?C'è qualcosa che non va con che avvolge un pezzo di codice con
extern "C" { extern "C" { .. } }
? Cosa farà il secondoextern "C"
?Non mettiamo questo wrapper attorno ai file .c, solo i file .h. Quindi, cosa succede se una funzione non ha un prototipo? Il compilatore pensa che sia una funzione C++?
Stiamo anche utilizzando alcuni codice di terze parti che è scritto in C , e non non abbiamo questo tipo di involucro intorno esso. Ogni volta che includo un'intestazione da quella libreria, ho inserito uno
extern "C"
in tutto il #include. È questo il modo giusto per gestire lo ?Infine, questa è una buona idea? C'è qualcos'altro che dovremmo fare? Stiamo miscelando C e C++ per il prossimo futuro, e io vogliamo assicurarci che stiamo coprendo tutte le nostre basi .
Dai un'occhiata a [C++ FQA: mixing C e C++] (http://yosefk.com/c++fqa/mixing.html) e [C++ FAQ: mixing C e C++] (http: // www .parashift.com/C++ - faq-lite/mixing-c-e-cpp.html). – Lazer
Concisamente, questa è la spiegazione migliore: 'Per garantire che i nomi dichiarati in quella parte di codice abbiano il collegamento C, e quindi il manichino del nome C++ non viene eseguito. (L'ho preso da [il collegamento] (https : //cboard.cprogramming.com/c-programming/150020-whats-purpose-sharpifdef-__cplusplus.html)) – anhldbk