预处理运算符的优先级“已定义”?

时间:2018-11-16 23:10:48

标签: c operators c-preprocessor

我正在使用c预处理程序,并且发现,由于“ defined”是仅用于预处理程序的运算符,因此其优先级从未在其他c运算符中列出。由于它是一元逻辑,因此我将其放在第二层,但是...

有人知道确切答案吗?

2 个答案:

答案 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规定了常量表达式的语义