Я работаю над проектом, в котором много унаследованного C кода. Мы начали писать на C ++ с намерением в конечном итоге преобразовать и унаследованный код. Я немного запутался в том, как C и C ++ взаимодействуют. Я понимаю, что, заключив код C в extern «C»
, компилятор C ++ не будет искажать имена кода C , но я не совсем уверен, как чтобы реализовать это.
Итак, вверху каждого заголовочного файла C (после включаемых охранников) у нас есть
#ifdef __cplusplus
extern "C" {
#endif
, а внизу мы пишем
#ifdef __cplusplus
}
#endif
Между ними, у нас есть все наши include, typedefs и прототипы функций.
включает файл заголовка C Bh,
включает другой файл заголовка C Ch,
как это работает? я так думаю
когда компилятор переходит в Bh,
__ cplusplus
будет определен, поэтому он
будет заключать код в оболочку extern "C"
(и __ cplusplus
не будет
определены внутри этого блока). Так,
когда он переходит в Ch,
__ cplusplus
не будет определен
и код не будет заключен в
внешний "C"
. Это правильно?
Что-то не так с
обертывание фрагмента кода
extern "C" {extern "C" {..}}
?
Что будет у второго внешнего "C"
do?
Мы не помещаем эту оболочку вокруг файлов .c, только файлы .h. Итак, что произойдет, если у функции нет прототипа? Считает ли компилятор, что это функция C ++?
Мы также используем сторонние
код, написанный на C , и
не иметь такой обертки вокруг
Это. Каждый раз, когда я включаю заголовок
из этой библиотеки я помещал
extern «C»
вокруг #include.
Это правильный способ справиться с
это?
Наконец, это хорошая идея? Что нам еще нужно сделать? Мы собираемся смешивать C и C ++ в обозримом будущем, и я хочу убедиться, что мы покрываем все наши базы.