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名可能与关键字名相同。 标识符名称中的有效字符包括digits
和non-digits
,不得以数字开头。 non-digits
包括大写字母AZ,小写字母az,下划线和任何实现定义的字符。