Как определить, скомпилирован ли код C (который требует 'extern C') в C ++ - PullRequest
46 голосов
/ 11 марта 2019

У меня есть заголовок C как часть библиотеки C ++.

Этот заголовок C имеет смысл только скомпилировать компилятор C или компилятор C ++ в блоке extern "C" { ... }, в противном случае неразрешенные ошибки ссылкимогло произойти.

Я думал добавить блок, такой как:

#ifdef __cplusplus
#error "Compiling C bindings with C++ (forgot 'extern \"C\"'?)"
#endif

в заголовок C, но, к сожалению, макрос __cplusplus определен также в блоке extern "C" { ... }.

Есть ли другой способ правильно определить это состояние?

1 Ответ

101 голосов
/ 11 марта 2019

Обычная практика - не требовать, чтобы клиентский код переносил ваш заголовок в extern "C", а делать это условно самостоятельно. Например:

#ifdef __cplusplus
extern "C" {
#endif

  // Header content

#ifdef __cplusplus
}
#endif

Таким образом, клиентский код автоматически корректируется, не делая ничего, кроме заголовка.

...