【发布时间】:2021-09-25 05:17:44
【问题描述】:
上下文:C 编译器故意不支持某些功能,同时符合实现。还好吗?
一些例子。下面的所有编译器都是符合标准的实现(__STDC__ 定义为1)。然而:
-
gcc 不支持
#pragma STDC FENV_ACCESS和问题warning: ignoring ‘#pragma STDC FENV_ACCESS’ [-Wunknown-pragmas]。但是,fenv.h 是标准头文件,标准要求支持#pragma STDC FENV_ACCESS ON,因为ON是on-off-switch 中的选择之一:ON OFF DEFAULT。 -
msvc 不支持
#pragma STDC FP_CONTRACT,而是支持它自己的版本#pragma fp_contract ( { on | off } )。不过标准版是#pragma STDC FP_CONTRACT { ON | OFF | DEFAULT }。 -
Cygwin 上的 gcc:sscanf doesn't handle hexadecimal floating-point input。而 libc 是标准的一部分。
问题:是否允许实现故意提供有限的功能(或它自己的此类功能版本),同时仍然符合实现?
问题原因:更好地理解conforming implementation 的定义以及围绕现有一致性实现的情况。
注意:这里关注的领域只是符合托管实现。但是,该问题也适用于符合标准的独立实现。
UPD。再说一遍:__STDC__ is defined to 1 表示可能符合实现,而不是符合实现。与标准的任何差异都会自动使此类实现成为“将 __STDC__ 定义为 1 的不合格实现”。
【问题讨论】:
-
Re “下面的所有编译器都是符合标准的实现(
__STDC__定义为 1)”:正如您之前所说,后者并不意味着前者。 C 标准需要符合标准的实现来定义__STDC__到1。它对不合格的实现没有管辖权,不能禁止他们将__STDC__定义为1。 -
要符合规范,实现必须符合规范的规则,这是一个基本原则。如果一个标准有一个实现做 X 的规则,而一个实现不做 X,那么它就是不符合的。很明显,如果这个问题中陈述的事实是真实的,那么实现是不符合的。那么问这个问题有什么意义呢?
-
如果一个标准有一个实现做X的规则,而一个实现不做X,那么它不符合。
-
以一致性为目标并不能保证一致性。 这很简单:如果一个标准有一个规则,一个实现做 X,而一个实现不做 X,那么它就是不符合的。
-
@pmor 如果 GCC 正在瞄准,那么它错过了。
标签: c language-lawyer c11 standards-compliance c17