【发布时间】:2015-02-11 11:36:54
【问题描述】:
我在理解 N1570 C11 草案中 5.1.1.3/1Diagnostics 子条款的语义时遇到了一些困难(强调我的):
如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的情况,则符合标准的实现应产生至少一个诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现定义。 在其他情况下无需生成诊断消息。9
我知道其目的是排除(非约束)未定义的行为(因此无法诊断缓冲区溢出等),但 #error 指令呢?如6.10.5/1 错误指令:
表单的预处理指令
# errorpp-tokensopt换行使实现生成诊断消息,其中包括指定的预处理标记序列。
这两个子条款不是互斥的吗?
有关其他参考,另请参阅DR#176。
【问题讨论】:
-
我认为其意图是
#error应该始终生成诊断消息,但在前面的条款中没有提到这一点。 -
IIRC Keith Thompson 说,错误指令是唯一需要实现来产生诊断的地方。
-
“不需要生产”不代表“不能生产”。
-
@remyabel:在这一点上,我认为“应生产”(
5.1.1.3/1)意味着“需要符合要求的实施”,并且该子条款是规范性的。 -
@GrzegorzSzpetkowski 准确地说,“应该”在这种情况下实际上意味着“必须”
标签: c language-lawyer