Каковы различия между препроцессорами C и С++?

Существуют ли различия в поведении между препроцессорами C и С++?

Они определяются различными отрывками стандартного текста (раздел 6.10 стандарта C и в разделе 16 Стандарт С++).

Моя мотивация для этого заключается в том, что предложение для создания отдельной цитаты разделителя цифр, которое недавно было принято в С++ 14, расширяет С++ preprocessor grammar, чтобы разместить это изменение (в частности, оно расширяет определение числа pp), и мне интересно, вводит ли это несовместимость между препроцессорами C и С++, и если да, то это первая функция для этого.

Ответ 1

Существуют некоторые различия между процессорами C и С++. Игнорируя различия в предопределенных макросах и доступных системных заголовках, некоторые отличия, которые приходят на ум в текущих версиях C и С++, следующие:

  • and и друзья - это операторы, а не идентификаторы, в С++. Это означает, что #define and && действителен в C, но не в С++, а означает #if 1 and 2, допустим в С++, но не в C (если and не определяется как макрос).
  • false и true разрешены в выражениях С++ #if, но заменены на 0 (как и все идентификаторы) в C. Это означает #if true/C++/#else/C/#endif расширяется до C++ или C, в зависимости от языка. В отличие от and и друзей, однако, это не операторы, поэтому их можно переопределить на #define на любом языке.
  • ::, .*, а ->* - токены в С++. В результате этого оператор ## может быть использован для формирования их в С++, но не в C.
  • Строковые литералы строки доступны на С++, но не в C. В результате, с учетом макроса foo, R"x("foo")x" расширяет макрос в C, но не на С++.
  • Шестнадцатеричные константы с плавающей запятой доступны в C, но не в С++. В результате, с учетом макроса foo, 0x1p+foo расширяет макрос в С++, но не в C.