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标准,因为我没有它的副本.
从海湾合作委员会文件:
预处理标记分为五大类:标识符,预处理数字,字符串文字,标点符号等.一个 标识符是相同的C中的标识符:字母,数字,或者下划线的任意序列,其以字母或下划线开始.C的关键词对预处理器没有意义; 它们是普通的标识符.例如,您可以定义名称为关键字的宏.唯一可以被视为预处理关键字的标识符是
defined
.见定义.对于使用C预处理器的其他语言来说,情况尤其如此.但是,即使在预处理器中,C++的一些关键字也很重要.请参阅C++命名运算符.
在1999 C标准中,标识符可能包含不属于"基本源字符集"的字母,由执行人员自行决定(例如重音拉丁字母,希腊字母或中文表意文字).这可以通过扩展字符集或
'\u'
和'\U'
转义序列来完成.GCC中此功能的实现是实验性的; 这些字符仅在'\u'
和'\U'
表单中被接受,并且仅在-fextended-identifiers
使用时才被接受 .作为延伸,海湾合作委员会将其
'$'
视为一封信.这是为了与某些系统(如VMS)兼容,这些系统'$'
通常用于系统定义的函数和对象名称.'$'
不是严格符合模式的字母,或者如果您指定-$
选项.请参阅调用.
clang
允许很多"疯狂"的角色..虽然我一直在努力寻找任何多少押韵或理由 - 至于为什么 有些人被允许,有些则不然.例如..
#define ?: /// WORKS FINE #define ? @end /// WORKS FINE #define @interface /// WORKS FINE #define ? @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_].
使用CAPITALIZED名称来区分宏与其他标识符(变量和函数名称)的常见用法.