Я работаю над проектом, который имеет много наследия Код C. Мы начали писать на C++, имея в виду, наконец, преобразовать устаревший код. Я немного смущен тем, как взаимодействуют C и C++. Я понимаю, что, обернув код C с помощью extern "C"
, компилятор C++ не будет искажать имена кодов C, но я не совсем уверен, как это реализовать.Объединение C++ и C - как работает #ifdef __cplusplus?
Таким образом, в верхней части каждого файла заголовка C (после того, как включить охрану), мы имеем
#ifdef __cplusplus
extern "C" {
#endif
и на дне, мы пишем
#ifdef __cplusplus
}
#endif
между двумя , у нас есть все наши включения, typedefs и прототипы функций. У меня есть несколько вопросов, чтобы увидеть, если я понять это правильно:
Если у меня есть C++ файл A.hh, который включает в себя C файл с заголовка Bh, включает другой заголовок C файл Ch, Как это работает? Я думаю, что когда шаги компилятора в B.h, будут определяться
__cplusplus
, так это будет обернуть код сextern "C"
(и__cplusplus
не будут определены внутри этого блока). Итак, , когда он вступает в C.h,__cplusplus
не будет определен , и код не будет обернут вextern "C"
. Это верно?Есть ли что-то не так с обертыванием фрагмента кода с
extern "C" { extern "C" { .. } }
? Что будет делать второйextern "C"
?Мы не помещаем эту оболочку вокруг файлов .c, только файлы .h. Итак, что произойдет, если функция не имеет прототипа? Компилятор считает, что это C++-функция?
Мы также используем некоторые сторонние код, написанный на C , и не не имеют такого рода обертки вокруг это. Каждый раз, когда я включаю заголовок из этой библиотеки, я помещал
extern "C"
вокруг #include. Это правильный способ справиться с что?И, наконец, это хорошая идея? Есть ли что-нибудь еще, что мы должны делать? Мы собираемся смешать C и C++ в обозримом будущем, а I хочу удостовериться, что мы покрываем все базы .
Посмотрите на [C++ FQA: смешивание C и C++] (http://yosefk.com/c++fqa/mixing.html) и [C++ FAQ: смешение C и C++] (http: // www .parashift.com/C++ - чаво-облегченный/смесительно-с-и-cpp.html). – Lazer
Вкратце, это лучшее объяснение: 'Чтобы гарантировать, что имена, объявленные в этой части кода, имеют C-ссылку, и, таким образом, сбой имени C++ не выполняется.' (у меня есть это [ссылка] (https : //cboard.cprogramming.com/c-programming/150020-whats-purpose-sharpifdef-__cplusplus.html)) – anhldbk