Объединение C ++ и C - как работает #ifdef __cplusplus ?

Я работаю над проектом, в котором много унаследованного 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 ++ в обозримом будущем, и я хочу убедиться, что мы покрываем все наши базы.

  • 293
    задан Jonathan Leffler 29 May 2016 в 20:08
    поделиться