延期可以取消现有的标准要求吗?

标签 c language-lawyer c11 standards-compliance c17

Why do conforming implementations behave differently w.r.t. incomplete array types with internal linkage? 的后续问题.
上下文:默认情况下,在 gcc 和 clang(符合实现)中,要求 C11,6.9.2p3 [1] 被取消,它被定位为扩展。
问题:扩展可以取消现有的标准要求,同时保持实现的一致性吗?
[1] C11,6.9.2 外部对象定义,3:

If the declaration of an identifier for an object is a tentative definition and has internal linkage, the declared type shall not be an incomplete type.


更新。是的。换句话说:标准说:“我们不支持这个,需要诊断”。扩展说:“我们确实支持这一点(因此,标准所需的诊断是无关紧要的)”。

最佳答案

该标准要求,如果程序违反约束部分中的约束,则实现必须至少发出一个诊断。没有要求文件是否有意义或与约束违反有任何关系。无条件输出“警告:此实现不会尝试强制执行其作者认为愚蠢的约束”的实现就足够了。同样,包含命令行选项的实现可以输出这样的消息和文档,除非指定了该选项,否则它可能不符合要求。
请注意,即使该要求也有漏洞:如果程序超出了实现的翻译限制,则实现可能以任何方式运行,不受限制,并且不必发出任何类型的诊断。尽管标准要求每个实现必须存在至少一个源程序,该源程序至少名义上执行标准中给出的翻译限制而不会导致实现出现故障,但实现可能对翻译限制的交互方式施加任意限制,例如允许程序包含一个最多 63 个字符的标识符,或者包含更多长度不超过三个字符的标识符。在极少数情况下,符合其他条件的实现对特定源文本所做的任何事情都会使其不符合要求。

关于延期可以取消现有的标准要求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68683211/

相关文章:

c - libcurl 中 curl_easy_perform() 的源代码在哪里?

c++ - 如果 constexpr 格式正确,这是在内部使用 static_assert 吗?

c++ - 文档/规范中的哪个位置描述了如何在文本模式下将 '\n' 转换为特定于平台的行结尾?

使用 atomic_fetch_add_explicit 创建一个计数器

c - 适用于 gcc c11,但在 Clang 3.6 c11 上我得到 malloc() : memory corruption (fast): 0x0000000000fb8620

c - 如何判断我是否将 UDP 数据包发送到开放端口?

java - 通过 java 套接字与 c 服务器的套接字

c - 返回一个 float 变量会失去其在 C 中的精度

c++ - 字符串文字左值和右值引用的函数重载

c - 编译 clang 的 <noreturn.h> 和 Windows header 时出现 declspec 错误