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

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

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

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

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

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

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

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

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

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

  • C99 N1256 черновик 6.10.8 «Предопределенные имена макросов»
  • C ++ 11 N3337 черновик 16.8 «Предопределенные имена макросов»

В частности:

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

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

  • Используйте CSS для автоматического добавления звездочки «обязательное поле» для формирования входных данных
  • size_t всегда без знака?
  • Предоставляет ли компилятор возможность переработать освобожденные переменные указателя?
  • Существуют ли машины, где sizeof (char)! = 1 или, по крайней мере, CHAR_BIT> 8?
  • Возьмите адрес элемента массива «один конец прошлого» через индекс: легальный по стандарту C ++ или нет?
  • Как определить версию стандарта C ++, используемую компилятором?
  • Шестигранное представление цвета с альфа-каналом?
  • Как поместить элемент управления WebBrowser в IE9 в стандарты?
  • Использование Unicode в исходном коде на C ++
  • Нет определенного типа параметра функции по умолчанию для int? Я сошел с ума?
  • В чем разница между __PRETTY_FUNCTION__, __FUNCTION__, __func__?
  • Давайте будем гением компьютера.