Я працюю над проектом, який має багато застарілого коду С. Ми почали писати на C ++ з наміром врешті-решт перетворити застарілий код. Я трохи розгублений у взаємодії C і C ++. Я розумію , що обгортання C коду extern "C"
на C ++ компілятор буде спотворювати C кодових імен, але я не зовсім впевнений , як це реалізувати.
Отже, у верхній частині кожного файлу заголовка C (після включення охоронців) у нас є
#ifdef __cplusplus
extern "C" {
#endif
а внизу пишемо
#ifdef __cplusplus
}
#endif
Між ними, у нас є всі наші прототипи включає в себе, typedefs та функції. У мене є кілька запитань, щоб побачити, чи я правильно це розумію:
Якщо у мене є файл C ++ A.hh, який включає файл заголовка C Bh, включає ще один файл заголовка C Ch, як це працює? Я думаю, що коли компілятор крокує в Bh,
__cplusplus
буде визначено, тому він оберне кодextern "C"
(і__cplusplus
не буде визначений всередині цього блоку). Отже, коли він переходить до Ch,__cplusplus
він не буде визначений і код не буде зафіксованийextern "C"
. Це правильно?Чи є щось погано в обгортанні фрагмента коду
extern "C" { extern "C" { .. } }
? Що будеextern "C"
робити другий ?Ми не ставимо цю обгортку навколо .c-файлів, а лише .h-файлів. Отже, що станеться, якщо функція не має прототипу? Чи вважає компілятор, що це функція C ++?
Ми також використовуємо сторонній код, який написаний на C , і не має такого роду обгортки навколо нього. Щоразу, коли я включаю заголовок із цієї бібліотеки, я розміщую
extern "C"
навколо #include. Це правильний спосіб боротьби з цим?Нарешті, чи є ця настройка гарною ідеєю? Чи є ще щось, що ми повинні зробити? Ми будемо змішувати C і C ++ в осяжному майбутньому, і я хочу переконатися, що ми покриваємо всі наші бази.
To ensure that the names declared in that portion of code have C linkage, and thus C++ name mangling is not performed.
(я отримав це за посиланням )