Является ли препроцессор C++ идентичным препроцессору C?
Мне интересно, насколько разные препроцессоры для C++ и C.
Причиной этого вопроса является этот вопрос по специфическому для препроцессора вопросу, где параграф стандарта, в котором рассматривается вопрос, имеет другую формулировку (и другой номер параграфа), а также различие в отношении true
а также false
ключевые слова в C++.
Итак, есть ли еще различия или это единственное отличие?
Расширение вопроса было бы, когда исходный файл по-разному излучается препроцессором C++ и препроцессором C.
3 ответа
Препроцессор C++03 (по крайней мере, должен) быть похожим на препроцессор C до C99. Хотя номера формулировок и абзацев немного отличаются, единственное техническое различие, о котором я знаю между ними, заключается в том, что препроцессор C++ обрабатывает диграфы и имена универсальных символов, которых нет в C.
Начиная с C99, препроцессор C добавил некоторые новые возможности (например, variadic macros), которых нет в текущей версии C++. Я точно не помню, но не верю, что были добавлены орграфы.
Я верю, что C++0x снова приведёт их в соответствие (по крайней мере, это и есть намерение). Опять же, номера абзацев и формулировки не будут идентичны, но я считаю, что они должны работать одинаково (за исключением сохранения различий, упомянутых выше).
Они должны быть одинаковыми: C++98 и C++03 должны соответствовать C90, а C++0x должен соответствовать C99. Однако в формулировке могут быть ошибки.
Предопределенные макросы различаются между препроцессорами, в основном из-за очевидных отличий языковых возможностей. Например, сравнить:
- C99 N1256 черновик 6.10.8 "Предопределенные имена макросов"
- C++ 11 N3337 черновик 16.8 "Предопределенные имена макросов"
Особенно:
- С требует от вас не определять
__cplusplus
, C++ использует его для представления версии - C использует
__STDC__
для представления версии C++ говорит, что она определена и использует реализацию__cplusplus
вместо - С имеет
__STDC_IEC_559__
а также__STDC_IEC_559_COMPLEX__
чтобы указать характеристики с плавающей запятой, C++ не заменяет и, по-видимому, заменяет его типом per perstd::numeric_limits<float>::is_iec559
константы - В C нет макросов с префиксом
__STDCPP
:_STDCPP_STRICT_POINTER_SAFETY__
а также__STDCPP_THREADS__
Как упомянул DevSolar, C11 добавил еще много определений, которые не являются частью C++ 11.