Pracuję nad projektem, który ma dużo starszego kodu C. Zaczęliśmy pisać w C ++ z zamiarem ostatecznej konwersji starszego kodu. Jestem trochę zdezorientowany co do interakcji między C i C ++. Rozumiem, że poprzez owinięcie C kodu z extern "C"
C ++ kompilator nie będzie Magiel C pseudonimów, ale nie jestem do końca pewien, jak zaimplementować to.
Tak więc u góry każdego pliku nagłówka C (po strażnikach dołączania) mamy
#ifdef __cplusplus
extern "C" {
#endif
a na dole piszemy
#ifdef __cplusplus
}
#endif
Pomiędzy nimi mamy wszystkie prototypy dołączania, typedef i funkcji. Mam kilka pytań, aby sprawdzić, czy rozumiem to poprawnie:
Jeśli mam plik C ++ A.hh, który zawiera plik nagłówka C Bh, zawiera inny plik C nagłówka Ch, jak to działa? Myślę, że kiedy kompilator wejdzie w Bh,
__cplusplus
zostanie zdefiniowany, więc otoczy kodextern "C"
(i__cplusplus
nie zostanie zdefiniowany w tym bloku). Tak więc, gdy wejdzie w Ch,__cplusplus
nie zostanie zdefiniowany, a kod nie zostanie zawiniętyextern "C"
. Czy to jest poprawne?Czy jest coś złego w pakowaniu kodu
extern "C" { extern "C" { .. } }
? Co zrobi drugiextern "C"
?Nie umieszczamy tego opakowania wokół plików .c, tylko pliki .h. Co się stanie, jeśli funkcja nie będzie miała prototypu? Czy kompilator uważa, że jest to funkcja C ++?
Używamy również kodu innej firmy, który jest napisany w C i nie ma tego rodzaju opakowania. Za każdym razem, gdy dołączam nagłówek z tej biblioteki, umieszczam
extern "C"
wokół #include. Czy to właściwy sposób, aby sobie z tym poradzić?Wreszcie, czy to dobry pomysł? Czy jest coś jeszcze, co powinniśmy zrobić? Będziemy mieszać C i C ++ w dającej się przewidzieć przyszłości i chcę się upewnić, że zajmiemy się wszystkimi naszymi bazami.