Pav*_*kin 4 c undefined-behavior language-lawyer c-preprocessor c11
我可以这么理解:
if (i+1 < i) { /* never_executed_code */ };UPD:ifi是有符号整数)。但是,我还不明白为什么 C 预处理器是未定义行为的主题?众所周知,预处理指令是在编译时执行的。
考虑 C11,6.10.3.3 ## 运算符,3:
如果结果不是有效的预处理标记,则行为未定义。
为什么不把它作为一个约束呢?例如:
结果应是有效的预处理令牌。
同样的问题也适用于 6.10 预处理指令中的所有其他“行为未定义”。
为什么 C 预处理器是未定义行为的主体?
当C标准创建时,有一些现有的C预处理器,并且在标准化委员会成员的脑海中也有一些想象的理想C预处理器。
因此存在这些灰色区域,委员会成员不完全确定他们想要做什么和/或现有的 C 预处理器实现在行为上彼此不同。
因此,这些情况不是定义的行为。因为 C 委员会成员并不完全确定行为实际上应该是什么。所以对于应该是什么没有要求。
UB的起源之一
是的,其中之一。
UB 的存在可能是为了简化该语言的实现。例如,在预处理器的情况下,预处理器编写者不必关心当无效的预处理器标记是 的结果时会发生什么##。
或者 UB 的存在可能是为了协调具有不同行为的现有实现或作为扩展点。因此,在 UB 情况下出现段错误的预处理器、在 UB 情况下接受并工作的预处理器以及在 UB 情况下格式化硬盘驱动器的预处理器,所有这些都可以符合标准(但我不想在这方面工作)格式化您的驱动器的一个)。
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |