Препроцессор С++ идентичен препроцессору C?

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

В частности:

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

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