An̲*_*rew 40 c compiler-warnings c-preprocessor
C风格的宏名称是否与标识符具有相同的命名规则?在编译器升级之后,它现在为遗留应用程序发出此警告:
warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text
#define CHAR_& 38
Run Code Online (Sandbox Code Playgroud)
这行代码定义了&符号的ASCII值常量.
#define DOL_SN 36
#define PERCENT 37
#define CHAR_& 38
#define RT_SING 39
#define LF_PAR 40
Run Code Online (Sandbox Code Playgroud)
我假设这个定义(实际上没有被任何代码引用,据我所知)是错误的,应该改为像"CHAR_AMPERSAND"这样的东西?
Ada*_*eld 36
宏名称只能由字母数字字符和下划线,即'a-z','A-Z','0-9',和'_',和第一个字符不应该是一个数字.一些预处理器也允许美元符号字符'$',但你不应该使用它; 不幸的是我不能引用C标准,因为我没有它的副本.
预处理标记分为五大类:标识符,预处理数字,字符串文字,标点符号等.一个 标识符是相同的C中的标识符:字母,数字,或者下划线的任意序列,其以字母或下划线开始.C的关键词对预处理器没有意义; 它们是普通的标识符.例如,您可以定义名称为关键字的宏.唯一可以被视为预处理关键字的标识符是
defined.见定义.对于使用C预处理器的其他语言来说,情况尤其如此.但是,即使在预处理器中,C++的一些关键字也很重要.请参阅C++命名运算符.
在1999 C标准中,标识符可能包含不属于"基本源字符集"的字母,由执行人员自行决定(例如重音拉丁字母,希腊字母或中文表意文字).这可以通过扩展字符集或
'\u'和'\U'转义序列来完成.GCC中此功能的实现是实验性的; 这些字符仅在'\u'和'\U'表单中被接受,并且仅在-fextended-identifiers使用时才被接受 .作为延伸,海湾合作委员会将其
'$'视为一封信.这是为了与某些系统(如VMS)兼容,这些系统'$'通常用于系统定义的函数和对象名称.'$'不是严格符合模式的字母,或者如果您指定-$选项.请参阅调用.
Ale*_*ray 10
clang允许很多"疯狂"的角色..虽然我一直在努力寻找任何多少押韵或理由 - 至于为什么 有些人被允许,有些则不然.例如..
#define ?: /// WORKS FINE
#define ? @end /// WORKS FINE
#define @interface /// WORKS FINE
#define ? @protocol /// WORKS FINE
Run Code Online (Sandbox Code Playgroud)
然而
#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.
Run Code Online (Sandbox Code Playgroud)
谁知道. 我很乐意......但到目前为止,Google已经让我失望了.任何关于这个主题的见解,将是赞赏的️.
| 归档时间: |
|
| 查看次数: |
46213 次 |
| 最近记录: |