Является ли препроцессор 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. Однако в формулировке могут быть ошибки.

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

Особенно:

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

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

Другие вопросы по тегам