Является ли препроцессор C ++ идентичным препроцессору C? - PullRequest
24 голосов
/ 23 февраля 2011

Мне интересно, насколько различны препроцессоры для C ++ и C .

Причина вопроса заключается в этом вопросе по конкретному вопросу препроцессора, гдеабзац стандарта, в котором рассматривается вопрос, имеет другую формулировку (и другой номер абзаца), а также различие в отношении ключевых слов true и false в C ++.

Итак, есть ли различия или естьв этом единственное отличие.

Расширение вопроса будет в том случае, когда исходный файл по-разному излучается препроцессором C ++ и препроцессором C .

Ответы [ 3 ]

17 голосов
/ 23 февраля 2011

Препроцессор C ++ 03 (по крайней мере, должен) быть похожим на препроцессор C до C99. Несмотря на то, что номера формулировок и абзацев немного отличаются, единственное техническое различие, о котором я знаю между ними, заключается в том, что препроцессор C ++ обрабатывает диграфы и универсальные имена символов, которых нет в C.

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

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

4 голосов

Предопределенные макросы отличаются между препроцессорами, в основном из-за очевидных различий в характеристиках языка. Например. Для сравнения:

В частности:

  • C требует от вас не определять __cplusplus, C ++ использует его для представления версии
  • C использует __STDC__ для представления версии, C ++ говорит, что она определена реализацией и использует __cplusplus вместо
  • C имеет __STDC_IEC_559__ и __STDC_IEC_559_COMPLEX__ для обозначения характеристик с плавающей запятой, C ++ не заменяет и, по-видимому, заменяет на константы для каждого типа std::numeric_limits<float>::is_iec559
  • C не имеет макросов с префиксом __STDCPP: _STDCPP_STRICT_POINTER_SAFETY__ и __STDCPP_THREADS__

Как уже упоминал DevSolar, C11 добавил еще много определений, которые не являются частью C ++ 11.

4 голосов
/ 23 февраля 2011

Они должны быть одинаковыми: C ++ 98 и C ++ 03 должны соответствовать C90, а C ++ 0x должен соответствовать C99.Однако в формулировке могут быть ошибки.

...