Каковы допустимые символы для имен макросов? - PullRequest
38 голосов
/ 15 декабря 2008

Подходят ли имена макросов в стиле 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"?

Ответы [ 4 ]

32 голосов
/ 15 декабря 2008

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

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

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

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

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

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

9 голосов
/ 16 декабря 2015

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 пока что подвел меня. Буду признателен за любую информацию по этому вопросу ™ ️.

8 голосов
/ 15 декабря 2008

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

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

1 голос
/ 15 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...