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”?
答案 0 :(得分:32)
宏名称应仅由字母数字字符和下划线组成,即'a-z'
,'A-Z'
,'0-9'
和'_'
,并且第一个字符不应为数字。一些预处理器也允许美元符号字符'$'
,但你不应该使用它;不幸的是我不能引用C标准,因为我没有它的副本。
预处理令牌分为五个 广义类:标识符, 预处理数字,字符串 文字,标点符号等。一个 标识符与a相同 C中的标识符:任何序列 字母,数字或下划线,其中 以字母或下划线开头。 C的关键词没有意义 预处理器;他们很普通 身份标识。您可以定义一个宏 例如,其名称是关键字。 唯一可以识别的标识符 被认为是预处理关键字
defined
。见定义。其他语言的情况大多如此 它使用C预处理器。然而, 一些C ++的关键词是 即使在预处理器中也很重要。 请参阅C ++命名运算符。
在1999 C标准中,标识符 可能包含不属于的部分的字母 “基本来源字符集”, 由执行人员自行决定 (例如重音拉丁字母,希腊语 字母或中文表意文字)。这个 可以用扩展字符完成 设置,或
'\u'
和'\U'
转义 序列。这个的实现 GCC的特征是实验性的;这样 字符只接受在 只有'\u'
和'\U'
形成 使用-fextended-identifiers
。作为扩展,GCC将
'$'
视为一个 信件。这是为了兼容 某些系统,例如VMS,其中'$'
通常用于系统定义 功能和对象名称。'$'
不是 严格符合要求的信件, 或者如果您指定-$
选项。看到 调用
答案 1 :(得分:9)
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.
谁知道。我很乐意......但到目前为止,谷歌已经让我失望了。任何有关该主题的见解,都将受到赞赏。️。
答案 2 :(得分:8)
你是对的,就名称而言,相同的规则适用于宏和标识符:有效字符是[A-Za-z0-9_]。
通常使用CAPITALIZED名称来区分宏与其他标识符 - 变量和函数名称。
答案 3 :(得分:1)
指定变量名称的有效标识符的相同规则适用于宏名称,但宏可能与关键字具有相同的名称。标识符名称中的有效字符包括digits
和non-digits
,不得以数字开头。 non-digits
包括大写字母A-Z,小写字母a-z,下划线和任何实现定义的字符。