Вопрос

Подпадают ли имена макросов в стиле 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, подчеркивание и любые символы, определенные реализацией.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top