Какие символы допустимы для имен макросов?
-
21-08-2019 - |
Вопрос
Подпадают ли имена макросов в стиле 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»?
Решение
Имена макросов должны состоять только из буквенно-цифровых символов и символов подчеркивания, т.е. 'a-z'
, 'A-Z'
, '0-9'
, и '_'
, и первый символ не должен быть цифрой.Некоторые препроцессоры также допускают использование символа доллара. '$'
, но вам не следует его использовать;к сожалению, я не могу процитировать стандарт C, поскольку у меня нет его копии.
Из Документация GCC:
Желатели предварительной обработки делятся на пять широких классов:Идентификаторы, предварительные цифры, струнные литералы, пунктуторы и другие.Ан идентификатор такой же, как идентификатор в C:Любая последовательность букв, цифр или подчеркивания, которая начинается с буквы или подчеркивания.Ключевые слова C не имеют значения для препроцессора;Они обычные идентификаторы.Вы можете определить макрос, например, имя которого является ключевым словом.Единственный идентификатор, который можно считать ключевым словом предварительной обработки, - это
defined
.См. Определено.Это в основном верно для других языков, которые используют препроцессор C.Тем не менее, некоторые из ключевых слов C ++ являются значительными даже в препроцессоре.См. Именованные операторы C++.
В стандарте C 1999 года идентификаторы могут содержать буквы, которые не являются частью «базового набора символов источника», по усмотрению реализации (например, акцентированные латинские буквы, греческие буквы или китайские идеограммы).Это может быть сделано с помощью расширенного набора символов или
'\u'
и'\U'
Последовательности побега.Реализация этой функции в GCC является экспериментальной;Такие персонажи принимаются только в'\u'
и'\U'
формы и только тогда, когда-fextended-identifiers
используется.В качестве расширения GCC рассматривает
'$'
как письмо.Это для совместимости с некоторыми системами, такими как виртуальные машины, где'$'
обычно используется в системной функции и именах объектов.'$'
не является буквой в строго соответствующем режиме, или если вы указываете-$
вариант.Смотрите призыв.
Другие советы
clang
допускает много «сумасшедших» персонажей..хотя я изо всех сил пытался найти любой много рифмы или причины - относительно почему некоторый разрешены, а другие нет.Например..
#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 пока меня подвел.Будем признательны за любую информацию по этому вопросу™️.
Вы правы, к макросам и идентификаторам применяются одни и те же правила, что касается имен:допустимые символы: [A-Za-z0-9_].
Обычно используются имена, написанные ЗАГЛАВНЫМИ БУКВАМИ, чтобы отличать макросы от других идентификаторов — переменных и имени функции.
Те же правила, которые определяют допустимые идентификаторы для имен переменных, применяются к именам макросов, за исключением того, что макросы могут иметь те же имена, что и ключевые слова.Допустимые символы в именах идентификаторов включают digits
и non-digits
и не должен начинаться с цифры. non-digits
включать прописные буквы A–Z, строчные буквы A–Z, подчеркивание и любые символы, определенные реализацией.