Подтвердить что ты не робот

Каковы допустимые символы для имен макросов?

Имена макросов в стиле C подчиняются тем же правилам именования, что и идентификаторы? После обновления компилятора он теперь выдает это предупреждение для устаревшего приложения:

warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text
  #define         CHAR_&        38

Эта строка кода определяет константу значения ASCII для амперсанда.

#define   DOL_SN        36
#define   PERCENT       37
#define   CHAR_&        38
#define   RT_SING       39
#define   LF_PAR        40

Я предполагаю, что это определение (на самом деле не упомянутое каким-либо кодом, насколько я могу судить) ошибочно и должно быть изменено на нечто вроде "CHAR_AMPERSAND"?

4b9b3361

Ответ 1

Имена макросов должны содержать только буквенно-цифровые символы и символы подчеркивания, т.е. 'a-z', 'a-z', '0-9' и '_', а первый символ не должен быть цифрой. Некоторые препроцессоры также допускают знак знака доллара '$', но вы не должны его использовать; к сожалению, я не могу процитировать стандарт C, так как у меня нет его копии.

Из Документация GCC:

Пункты предварительной обработки падают на пять широкие классы: идентификаторы, номера предварительной обработки, строка литералы, пунктуаторы и другие. идентификатор совпадает с идентификатором идентификатор в C: любая последовательность буквы, цифры или символы подчеркивания, которые начинается с буквы или подчеркивания. Ключевые слова C не имеют значения для препроцессор; они обычные идентификаторы. Вы можете определить макрос чье имя является ключевым словом, например. Единственный идентификатор, который может быть считается ключевое слово предварительной обработки defined. См. Раздел Определено.

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

В стандарте 1999 C, идентификаторы могут содержать буквы, которые не являются частью "базового набора символов источника", по усмотрению реализации (например, акцентированные латинские буквы, греческий буквы или китайские идеограммы). Эта может выполняться с расширенным характером set или '\u' и '\u' escape последовательности. Реализация этого Особенность в GCC является экспериментальной; такие символы принимаются только в '\u' и '\u' и только если -fextended-identifiers.

В качестве расширения GCC рассматривает '$' как письмо. Это для совместимости с некоторые системы, такие как VMS, где '$'обычно используется в системных функции и имена объектов. '$' не письмо в строго соответствующем режиме, или если вы укажете опцию -$. Видеть Призвание.

Ответ 2

clang позволяет много "сумасшедших" персонажей. Хотя я изо всех сил пытался найти любой много рифмы или разума - о том, почему разрешено some, и другие не. Например..

#define 💩  ?:          /// WORKS FINE
#define  ■  @end        /// WORKS FINE
#define 🅺  @interface  /// WORKS FINE
#define P  @protocol   /// WORKS FINE

пока

#define ☎   TEL     /// ERROR: Macro name must be an identifier.
#define ❌   NO     /// ERROR: Macro name must be an identifier.
#define ⇧   UP      /// ERROR: Macro name must be an identifier.
#define 〓   ==     /// ERROR: Macro name must be an identifier.
#define 🍎  APPLE   /// ERROR: Macro name must be an identifier.

Кто знает. Я бы с удовольствием... но Google, таким образом, мне удалось, пока. Любое понимание этого вопроса было бы оценено ™.

Ответ 3

Вы правы, те же правила применимы к макросам и идентификаторам в отношении имен: допустимыми являются символы [A-Za-z0-9_].

Это обычное использование для использования CAPITALIZED имен для дифференциации макросов из других идентификаторов - переменных и имени функции.

Ответ 4

Те же правила, которые указывают действительные идентификаторы имен переменных, применяются к именам макросов, за исключением того, что макросы могут иметь те же имена, что и ключевые слова. Допустимые символы в именах идентификаторов включают digits и non-digits и не должны начинаться с цифры. non-digits включают прописные буквы A-Z, строчные буквы a-z, символ подчеркивания и любые символы, определенные для реализации.