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