我在理解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/