3 回答
TA贡献1878条经验 获得超4个赞
宏名称只能由字母数字字符和下划线,即'a-z','A-Z','0-9',和'_',和第一个字符不应该是一个数字。一些预处理器还允许使用美元符号字符'$',但您不应该使用它。不幸的是,由于我没有C标准,所以我无法引用它。
从GCC文档中:
预处理令牌分为五大类:标识符,预处理数字,字符串文字,标点符号等。一个 标识符是相同的C中的标识符:字母,数字,或者下划线的任意序列,其以字母或下划线开始。C的关键字对预处理器没有任何意义;它们是普通标识符。例如,您可以定义名称为关键字的宏。可以视为预处理关键字的唯一标识符是 defined。请参阅已定义。
对于使用C预处理程序的其他语言,大多数情况都是如此。但是,即使在预处理器中,C ++的一些关键字也很重要。请参阅C ++命名运算符。
在1999 C标准中,标识符可以包含不属于“基本来源字符集”的字母,具体取决于实现方式(例如带重音的拉丁字母,希腊字母或中文表意文字)。这可以通过扩展字符集或'\u'和'\U'转义序列来完成。此功能在GCC中的实施是实验性的;此类字符仅在'\u'和'\U'形式中接受, 并且仅在 -fextended-identifiers使用时使用。
作为扩展,GCC视为'$'字母。这是为了与某些系统(例如VMS)兼容,该系统'$' 通常在系统定义的函数和对象名称中使用。'$'在严格符合模式下不是字母,或者如果您指定了-$选项。请参阅调用。
TA贡献1871条经验 获得超8个赞
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一直使我失败。任何关于这个问题的见解,将不胜感激™️。
TA贡献1815条经验 获得超13个赞
为变量名称指定有效标识符的相同规则适用于宏名称,但宏可能与关键字具有相同的名称。标识符名称中的有效字符包括digits
,non-digits
并且不能以数字开头。 non-digits
包括大写字母AZ,小写字母az,下划线和任何实现定义的字符。
- 3 回答
- 0 关注
- 540 浏览
添加回答
举报