Препроцессор C ++ идентичен препроцессору C?
Мне интересно, насколько отличаются препроцессоры для C ++ и C.
Причиной этого вопроса является вопрос о конкретном вопросе, посвящённом препроцессору, где абзац стандарта, который затрагивает вопрос, имеет другую формулировку (и другой номер абзаца), а также разницу в отношении true
и false
ключевых слов на C ++.
Итак, есть ли больше различий или это единственная разница.
- Почему компиляторы позволяют строковым литералам не быть const?
- Контейнеры стандартной библиотеки с дополнительными параметрами шаблона?
- std :: вектор и непрерывная память многомерных массивов
- Каковы правила об использовании подчеркивания в идентификаторе C ++?
- Где найти текущие стандартные документы C или C ++?
Расширение вопроса было бы тогда, когда исходный файл издавался по-разному с помощью препроцессора C ++ и препроцессора C.
- Правильное изменение неопределенного поведения, если число больше ширины типа?
- Подготовка к std :: iterator Будучи устаревшим
- Разница между void main и int main?
- Пространства в URL-адресах?
- Является ли `long` гарантией быть как минимум 32 бит?
- Это неуказанное поведение для сравнения указателей с разными массивами для равенства?
- Есть ли способ доступа к базовому контейнеру контейнеров-контейнеров STL?
- Что такое оператор «->» в 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.