【发布时间】:2021-10-11 10:39:44
【问题描述】:
上下文:在 gcc 和 clang(一致的实现)中,默认情况下,要求 C11,6.9.2p3 [1] 被取消,它被定位为扩展。
问题:扩展是否可以取消现有的标准要求,同时保持实施符合要求?
[1] C11,6.9.2 外部对象定义,3:
如果一个对象的标识符声明是一个暂定定义并且具有内部链接,则声明的类型不能是不完整的类型。
UPD。是的。换句话说:标准说:“我们不支持这个,需要诊断”。扩展程序说:“我们确实支持这一点(因此,标准所需的诊断是无关紧要的)”。
【问题讨论】:
-
AFAIK gcc 不声称符合要求,除非使用
-pedantic。 -
标准的规则不就是如果源代码违反约束,编译器必须发出诊断,然后可以继续做它喜欢的任何事情(例如忽略违规)吗?在您的另一篇文章中,
gcc -pedantic确实发出了诊断信息,所以它已经摆脱了困境。gcc本身不会发出诊断,因此它不符合要求,但它又从未声称是。 -
@NateEldredge 关于
gcc -pedantic:有这样的引用:“报告任何不符合 ISO C 的功能在某些情况下可能很有用,但需要大量额外的工作并且会完全不同来自 -Wpedantic。我们没有计划在不久的将来支持这样的功能。”。 -
对。一些不符合标准的程序会执行标准需要诊断的操作,而其他程序则不需要。
gcc -pedantic应该为第一类发出诊断。他们提到的这个假设特征将解决第二种程序。 -
@NateEldredge 仅供参考:观察 gcc:
-pedantic的存在/不存在不会改变__STDC__的定义(即 1)。 clang 也是一样。
标签: c language-lawyer c11 standards-compliance c17