如果一个实现支持额外的非标准特性,那么这样的实现是否符合要求?

If an implementation supports extra nonstandard features, then is such implementation conforming?

后续问题:

问题:如果一个实现支持 C 标准或任何“扩展文档”中都没有描述的额外功能,那么这样的实现是否符合要求?

一个简单的例子:#pragma STDC FP_CONTRACT需要on-off-switch,这是ON OFF DEFAULT之一。但是,除了 ON OFF DEFAULT 之外,还有一种实现支持 RESTORE。因此,这样的实现允许编写非标准代码。这是否意味着这样的实现是不合格的?

额外的问题:C 标准告诉“什么实现 shall/should 做什么”。但是,C 标准(或任何一般标准)是否告诉“什么实现 shall/should 不做”?例如,如果一个实现确实支持 my_printf(除了 printf),那么这样的实现是否符合?

该标准定义了三个一致性概念。按照意义的顺序,它们是“严格符合 C 程序”、“符合 C 实施”和“符合 C 程序”。

严格符合 C 的实现是其行为完全由标准指定的实现。这排除了独立实现的所有重要程序,因为标准没有为它们定义任何形式的 I/O 。它还排除了许多可移植的程序,如果标准试图避免将其行为可能难以在某些实现上定义的任何行为表征为 UB,或者其行为可能暴露有用优化的影响。

符合 C 的实现在理论上可以有意义地处理所有严格符合的程序,但在给定任何程序(无论是否严格符合)时可能会任意行为,这将超过实现的翻译限制。后一个警告会造成一个大到足以让卡车通过的漏洞。

虽然标准要求实施能够适应例如127 个嵌套块,块内有 511 个块范围标识符,结构或联合中有 1023 个成员,内部标识符名称中有 63 个字符,不需要实现能够容纳 127 个嵌套块,每个块有 511 个标识符每个标识一个具有 1023 个成员的结构,每个成员的名称长度为 63 个字符。这样的要求将使该语言无法在存储空间少于 4 GB 的任何翻译环境中得到支持。为避免使语言无法实施,该标准不要求实施支持翻译限制的任意组合。相反,一致性所必需的是存在一些程序——可能是人为的和无用的程序——名义上行使每个限制,至少是单独执行。作者在已发表的基本原理中承认,这样的要求非常薄弱:

The Standard requires that an implementation be able to translate and execute some program that meets each of the stated limits. This criterion was felt to give a useful latitude to the implementor in meeting these limits. While a deficient implementation could probably contrive a program that meets this requirement, yet still succeed in being useless, the C89 Committee felt that such ingenuity would probably require more work than making something useful

我认为他们高估了所需的“独创性”,但我认为关键在于标准是否会被视为符合一个实现,例如允许一个程序有一个 63 个字符长的标识符并将所有其他用户标识符限制为太长的字符,没有人想出售编译器会强加这样的限制。因此,虽然标准对“符合 C 实现”的定义实际上没有意义,但它仍然为非垃圾质量实现建立了一些基线期望。

至于“Conforming C Program”的概念,该术语被定义为包括被宇宙中某处至少一个Conforming C Implementation 接受的任何程序。这显然太宽泛而没有意义;我认为关键在于委员会希望避免将任何有用的程序归类为不合格程序。再次来自基本原理(斜体原文):

A strictly conforming program is another term for a maximally portable program. The goal is to give the programmer a fighting chance to make powerful C programs that are also highly portable, without seeming to demean perfectly useful C programs that happen not to be portable, thus the adverb strictly.

C 实现被明确授予向语言添加扩展的自由,无论是在语法上还是通过在标准没有强加要求的情况下定义行为(通常是“以环境的文档化时尚特征”处理构造),以及符合(但不严格符合)C 程序可以利用此类扩展。尽管名义上需要实现来生成诊断以响应某些此类构造,但无条件输出的实现将满足这样的要求:“警告——此实现不会产生作者认为愚蠢的诊断(除此之外)一个)”,程序员可以自由地忽略他们认为愚蠢的任何诊断。

重要的是要认识到许多实用且有用的 C 程序利用了有用的结构,这些结构得到广泛支持但并非普遍支持。如果委员会试图将无法支持此类构造的平台描述为实施不足,那么这些平台的制造商就会拒绝。如果它被描述为依赖于这种结构的不合格程序,它就会被编程社区坚决拒绝。因此,作为一种妥协,它为程序定义了一个“严格符合”的类别,范围非常狭窄,以至于不满足它很少被视为缺陷,否则就依赖于希望出售编译器的人来识别和满足程序员的需求谁会使用它们——当编译器编写者的主要客户是程序员时,这种理念行之有效。