我在理解N1570 C11草案的5.1.1.3/1 Diagnostics子句的语义时遇到了一些麻烦(重点是我的):



我知道目的是要排除(非约束)未定义的行为(因此无法进行例如缓冲区溢出的诊断),但是#error指令又如何呢?如6.10.5/1错误指令中所示:



这两个条款不是互斥的吗?

有关其他引用,请参见DR#176

最佳答案

C99比该DR的建议解决方案更进一步。他们不需要诊断,而是需要将其视为错误。



现在,严格来讲,也许您是对的,实现可以选择不编译包含#error指令的程序而无需发出诊断,声称5.1.1.3允许它忽略#error的语义。但是,在标准设置的范围内,这种实现在尽可能长的范围内尽可能无用的实现,可以轻松解决需要诊断的任何尝试:该实现可以简单地转储完整的预处理器输出(包括#error之后的所有内容),并跟随“在某处存在错误”。因此,该标准是否需要诊断实际上并不重要。没有理由不这样做,而且很少有标准可以强制不愿意的实现者。

关于c - C标准是否保证#error指令的诊断消息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27449060/

10-12 22:34