Sto lavorando a un progetto che ha un sacco di codice C legacy . Abbiamo iniziato a scrivere in C ++, con l'intento di convertire anche il codice legacy. Sono un po 'confuso su come interagiscono C e C ++. Comprendo che racchiudendo il codice C con extern "C"
il compilatore C ++ non verranno alterati i nomi del codice C , ma non sono del tutto sicuro di come implementarlo.
Quindi, nella parte superiore di ogni file di intestazione C (dopo le protezioni di inclusione), abbiamo
#ifdef __cplusplus
extern "C" {
#endif
e in fondo, scriviamo
#ifdef __cplusplus
}
#endif
Tra i due, abbiamo tutti i nostri include, typedef e prototipi di funzioni. Ho alcune domande per vedere se lo capisco correttamente:
Se ho un file C ++ A.hh che include un file di intestazione C Bh, include un altro file di intestazione C Ch, come funziona? Penso che quando il compilatore
__cplusplus
passerà a Bh, sarà definito, quindi avvolgerà il codice conextern "C"
(e__cplusplus
non sarà definito all'interno di questo blocco). Quindi, quando si passa a Ch,__cplusplus
non verrà definito e il codice non verrà inseritoextern "C"
. È corretto?C'è qualcosa di sbagliato nel racchiudere un pezzo di codice con
extern "C" { extern "C" { .. } }
? Cosa farà il secondoextern "C"
?Non inseriamo questo wrapper nei file .c, ma solo nei file .h. Quindi, cosa succede se una funzione non ha un prototipo? Il compilatore pensa che sia una funzione C ++?
Stiamo anche usando un codice di terze parti che è scritto in C e non ha questo tipo di wrapper. Ogni volta che includo un'intestazione da quella libreria, ho inserito un
extern "C"
#include. È questo il modo giusto di affrontarlo?Infine, questa impostazione è una buona idea? C'è qualcos'altro che dovremmo fare? Mescoleremo C e C ++ per il prossimo futuro e voglio assicurarmi di coprire tutte le nostre basi.