不受支持的标准功能会影响一致性吗?
Posted
技术标签:
【中文标题】不受支持的标准功能会影响一致性吗?【英文标题】:Do unsupported standard features affect conformance? 【发布时间】: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 正在瞄准,那么它错过了。
【参考方案1】:
如果一个标准有一个实现做 X 的规则,而一个实现不做 X,那么它就是不符合的。
【讨论】:
根据标准,实现符合要求的所有必要条件是存在一些名义上行使标准中给出的翻译限制的程序(可能是人为的和无用的),并且以一致的方式实施过程。如果实现这样做,它可能会施加其自己的任意翻译限制,例如要求程序在范围内一次不包含超过 10,000 个字符的标识符名称,或者要求它不包含字母r
更多超过两次,并且可能...
...如果超出任何翻译限制,则以任意方式行事。以上是关于不受支持的标准功能会影响一致性吗?的主要内容,如果未能解决你的问题,请参考以下文章