Цель упаковки заголовков с помощью #ifdef _cplusplus - PullRequest
1 голос
/ 18 декабря 2010
#ifdef _cplusplus
   #include headerfile.h
#endif

Я понимаю концепцию, стоящую за этим, хотя я не совсем понимаю, зачем это нужно.

Если целью является предотвращение искажения заголовков, когда код не скомпилирован в C ++:

- как код скомпилирован, если не в C ++?

- как бы код продолжал функционировать без этого заголовка?

И тангенциально:

- Какие обстоятельства потребуют этого?

Ответы [ 4 ]

4 голосов
/ 18 декабря 2010
  • как код скомпилирован, если не в C ++?

С С.

  • как бы код продолжал функционировать без этого заголовка?

Вот почему заголовок включен. Если бы он компилировался и работал без заголовка с компилятором C ++, #ifdef был бы довольно бессмысленным.

  • какие обстоятельства потребуют этого?

Они могут просто вносить необходимые данные при компиляции с помощью компилятора C ++. Возможно, макросу отладки нужно использовать std::cerr, тогда этот заголовок может включать <iostream>. У этого могут быть миллионы причин.

2 голосов
/ 18 декабря 2010

Обычная причина для этого - дать функции связи C или C ++:

#ifdef _cplusplus
extern "C" {
#endif
#include headerfile.h
#ifdef _cplusplus
}
#endif
1 голос
/ 18 декабря 2010

Если C ++ не определен, он будет полагаться на не специфичный для C ++ заголовок (возможно, написанный на C)

Какие обстоятельства потребуют этого, хороший вопрос.

0 голосов
/ 26 декабря 2013

Я знаю, что эта тема, вероятно, мертва, но она все еще очень жива в поисковых системах, поэтому я подумал, что опубликую более подробную информацию.C ++ искажает имена подпрограмм (добавляет набор символов), когда они компилируются.У меня нет знаний, чтобы сказать вам, почему это так.Я предполагаю, что подпрограммы будут однозначно идентифицированы среди всех пространств имен и классов в программе.Несмотря на это, C не искажает имена.Если вы попытаетесь включить файл заголовка C в ваш проект, то все будет отлично работать во время компиляции, но при ссылке на C ++ будет искажать имена подпрограмм в файле заголовка C и пытаться найти их в объектном файле для подпрограмм C.Он не сможет найти их, потому что ожидает, что они будут искажены.

Это наиболее распространено, когда вы пытаетесь использовать существующую библиотеку Си.В этом случае вы не можете перекомпилировать код C как C ++ для восстановления искажения имени.Поэтому вы должны указать компилятору C ++ искать подпрограммы в стиле C, используя 'extern "C".Поместить его в заголовочный файл не обязательно, но когда компилятор C ++ находит объявление подпрограммы C, он будет нуждаться в этом.Размещение заголовочного файла не должно повторяться.

Это также может происходить в некоторых IDE.Но в основном это приводит к тому, что библиотека C связывается с программой / библиотекой C ++.Если gcc использовался для его компиляции, g ++ будет трудно разобраться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...