C 预处理器运算符“的优先级”;定义为;?

C 预处理器运算符“的优先级”;定义为;?,c,operators,c-preprocessor,C,Operators,C Preprocessor,我正在研究一个c预处理器,并且发现,由于“defined”是一个仅用于预处理器的操作符,所以它的优先级从未在其他c操作符中列出。因为它是一元逻辑的,我把它放在第二层,但是 有人知道确切答案吗?C 2018 6.10.1 1说: 控制条件包含的表达式应为整数常量表达式,但以下情况除外:…它可能包含形式为“定义的标识符”或“定义的(标识符)”…[注:此处引号中的文本为原始文本中的偏移显示文本。] 短语“一元运算符表达式”指第6.5.3节(“一元运算符”),第6.5节(“表达式”)的一个子节。因此,定

我正在研究一个c预处理器,并且发现,由于“defined”是一个仅用于预处理器的操作符,所以它的优先级从未在其他c操作符中列出。因为它是一元逻辑的,我把它放在第二层,但是

有人知道确切答案吗?

C 2018 6.10.1 1说:

控制条件包含的表达式应为整数常量表达式,但以下情况除外:…它可能包含形式为“
定义的
标识符”或“
定义的(
标识符
”…[注:此处引号中的文本为原始文本中的偏移显示文本。]

短语“一元运算符表达式”指第6.5.3节(“一元运算符”),第6.5节(“表达式”)的一个子节。因此,
定义的
的行为与任何其他一元运算符的行为类似

但是,请注意,操作数必须是标识符。它不能是大多数普通运算符接受的常规一元表达式或强制转换表达式。正是这些一元表达式或强制转换表达式符号为一元表达式的语法引入了更高优先级的运算符。这意味着如果不允许使用定义的x++(甚至在考虑是否在整数常量表达式中出现
++
之前),则类似于
#,因此没有任何其他选项。“
defined
identifier”永远不会与任何更高优先级的运算符一起出现在标识符旁边。

if
指令后面紧跟着一个常量expersion。在计算常量表达式的其余部分之前,首先计算定义的任何
运算符

C标准第6.10.1p4节规定:

在评估之前,预处理列表中的宏调用 将成为控制常量表达式的标记是 替换(由定义的一元数修改的宏名称除外 运算符),就像在普通文本中一样。如果定义的令牌是 由于此更换过程或使用 定义的一元运算符与两个指定形式之一不匹配 在宏替换之前,行为是未定义的毕竟 由于宏扩展和定义的一元数而进行的替换 操作员已执行,所有剩余标识符
(包括那些在词汇上与关键字相同的词)被替换 pp编号为0,然后每个预处理令牌 转换成代币结果标记组成 控制常数表达式,该表达式根据 6.6的规则。


参考文献第6.6节规定了常量表达式的语义

您提到优先级的“级别”表明您指的是一些次要来源。如果您正在使用C预处理器,那么应该使用C标准。