Каковы допустимые символы для имен макросов?
Имена макросов в стиле 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"?
Ответы
Ответ 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, символ подчеркивания и любые символы, определенные для реализации.