我正在使用c预处理程序,并且发现,由于“ defined”是仅用于预处理程序的运算符,因此其优先级从未在其他c运算符中列出。由于它是一元逻辑,因此我将其放在第二层,但是...
有人知道确切答案吗?
答案 0 :(得分:2)
C 2018 6.10.1 1说:
控制条件包含的表达式应为整数常量表达式,除了……可以包含“
defined
identifier ”或“defined (
”形式的一元运算符表达式< em> identifier)
”…[注意:此处引号中的文本是原始显示中的偏移显示文本。]
“一元运算符表达式”是指6.5.3(“一元运算符”)的6.5小节(“表达式”)。因此,defined
的行为类似于其他任何一元运算符。
但是,请注意,操作数必须是一个标识符。大多数普通运算符都不能接受一般的 unary-expression 或 cast-expression 。正是这些 unary-expression 或 cast-expression 符号将较高优先级的运算符带入一元表达式的语法中。这意味着不允许使用#if defined x++
之类的东西(甚至在考虑++
是否可能出现在整数常量表达式中之前),因此永远没有其他选择。 “ defined
identifier ”永远不会与标识符旁边的任何更高优先级的运算符一起出现。
答案 1 :(得分:0)
在#if
指令后紧跟一个常数表达式。在评估其余常量表达式之前,先先评估所有defined
运算符。
C标准的6.10.1p4部分规定:
在评估之前,预处理列表中的宏调用 将成为控制常量表达式的标记是 替换(由定义的一元变量修改的那些宏名称除外) 运算符),就像普通文本一样。如果定义的令牌是 替换过程或使用 定义的一元运算符与两种指定格式之一都不匹配 在宏替换之前,该行为是未定义的。 毕竟 替换,原因是宏扩展和定义的一元 操作符已执行,其余所有标识符
(包括与关键字在词法上相同的词)被替换 pp编号为0,然后每个预处理令牌为 转换为令牌。 由此产生的令牌构成了 控制常数表达式,该表达式根据 6.6的规则。 ...
参考部分6.6规定了常量表达式的语义