macros名称的有效字符是什么?

C风格的macros名称是否与标识符具有相同的命名规则? 在编译器升级之后,它现在正在为传统应用程序发出这个警告:

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”的东西?

macros名称只能包含字母数字字符和下划线,即'a-z''A-Z''0-9''_' ,第一个字符不能是数字。 一些预处理器也允许美元符号字符'$' ,但是你不应该使用它; 不幸的是我不能引用C标准,因为我没有它的副本。

从GCC文档 :

预处理令牌分为五大类:标识符,预处理数字,string文字,标点符号和其他。 标识符与C中的标识符相同:字母,数字或下划线的任何序列,以字母或下划线开头。 C的关键字对预处理器没有意义, 他们是普通的标识符。 例如,您可以定义名称为关键字的macros。 defined了唯一可以被认为是预处理关键字的标识符。 见定义。

对于使用C预处理器的其他语言来说,情况大多如此。 但是,即使在预处理器中,C ++的一些关键字也是非常重要的。 请参阅C ++命名的运算符。

在1999年的C标准中,标识符可以包含字母,这些字母不是“基本源字符集”的一部分,在执行时可以自行决定(例如重音拉丁字母,希腊字母或汉字)。 这可以通过扩展字符集或'\u''\U'转义序列来完成。 这个function在GCC中的实现是实验性的; 只有在使用了-fextended-identifiers情况下,这些字符才被接受为'\u''\U'forms。

作为一个扩展,GCC将'$'视为一封信。 这是为了与一些系统(如VMS)兼容,其中'$'通常用于系统定义的函数和对象名称。 '$'不是严格符合模式的字母,或者是指定了-$选项。 请参阅调用。

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已经失败了。 任何有关这个问题的见解,将不胜感激™️。

你是对的,就名称而言,相同的规则适用于macros和标识符:有效的字符是[A-Za-z0-9_]。

使用CAPITALIZED名称来区分macros和其他标识符(variables和函数名称)是常见的用法。

指定variables名的有效标识符的相同规则适用于macros名,但macros名可能与关键字名相同。 标识符名称中的有效字符包括digitsnon-digits ,不得以数字开头。 non-digits包括大写字母AZ,小写字母az,下划线和任何实现定义的字符。