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