Препроцессор С++ идентичен препроцессору 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.