问题标签 [c17]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 如果 -0.0 之后的下一个可表示值是 +0.0,那么为什么 nextafter(-0.0, INFINITY) 不返回 +0.0?
如果之后的下一个可表示值-0.0
是+0.0
,那为什么nextafter(-0.0, INFINITY)
不返回+0.0
呢?
c - HAS_SUBNORM 和 __STDC_IEC_559__ 是否依赖?
是HAS_SUBNORM
和__STDC_IEC_559__
依赖?例如:
- 如果
__STDC_IEC_559__
为 1,HAS_SUBNORM
则为 1。 - 如果
HAS_SUBNORM
是0,那么__STDC_IEC_559__
就不是1。
c - 哪些 C 规则允许在函数声明器中使用之前定义为类型的标识符?
考虑这段代码(t0.c):
调用:
问题:
- 哪些 C 规则允许在函数声明器中使用之前定义为类型的标识符?
- 如果 msvc 说
nonstandard extension
,那么为什么符合标准的 gcc / clang 什么都不说?
c - 不受支持的标准功能会影响一致性吗?
背景:C 编译器故意不支持某些功能,同时符合实现。可以吗?
一些例子。下面的所有编译器都是符合标准的实现(__STDC__
定义为1
)。然而:
gcc 不支持
#pragma STDC FENV_ACCESS
和问题warning: ignoring ‘#pragma STDC FENV_ACCESS’ [-Wunknown-pragmas]
。但是, fenv.h 是标准头文件,标准#pragma STDC FENV_ACCESS ON
要求支持 of,因为它是on-off-switch :ON
中的选择之一。ON OFF DEFAULT
msvc 不支持
#pragma STDC FP_CONTRACT
,而是支持它自己的版本#pragma fp_contract ( { on | off } )
。但是,标准版本是#pragma STDC FP_CONTRACT { ON | OFF | DEFAULT }
.Cygwin 上的 gcc:sscanf 不处理十六进制浮点输入。libc 是标准的一部分。
问题:是否允许实现故意提供有限的功能(或其自己的此类功能版本),同时仍然符合实现?
问题的原因:更好地理解conforming implementation
现有一致性实现的定义和状态。
注意:这里感兴趣的领域只是符合托管实现。但是,该问题也适用于符合独立实施的要求。
UPD。再次:__STDC__ is defined to 1
意味着可能符合实施而不是符合实施。与标准的任何差异都会自动使此类实现成为“定义__STDC__
为 1 的不合格实现”。
c - 如果一个实现支持额外的非标准特性,那么这样的实现是否符合要求?
后续问题:不受支持的标准功能会影响一致性吗?.
问题:如果一个实现支持 C 标准中没有描述的额外特性,也没有在任何“扩展文档”中描述,那么这样的实现是否符合要求?
一个简单的例子:#pragma STDC FP_CONTRACT
requires on-off-switch
,它是 之一ON OFF DEFAULT
。但是,除了ON OFF DEFAULT
支持RESTORE
. 因此,这种实现允许编写非标准代码。这是否意味着这样的实现是不合格的?
额外的问题:C 标准告诉“实现应该/应该做什么”。但是,C 标准(或任何一般标准)是否告诉“应该/不应该做什么实现”?例如,如果一个实现确实支持my_printf
(除了printf
),那么这样的实现是否符合要求?
c - 是否可以在编译时确定实现是否提供精确宽度的整数类型?
是否可以在编译时确定实现是否提供精确宽度的整数类型?示例代码(需要):
问题的原因:编写适应性代码,如果实现不提供精确宽度的整数类型,则不会导致编译时错误。
c - 延期可以取消现有的标准要求吗?
后续问题为什么一致的实现在具有内部链接的不完整数组类型中表现不同?.
上下文:默认情况下,在 gcc 和 clang(一致的实现)中,要求 C11,6.9.2p3 [1] 被取消,它被定位为扩展。
问题:扩展可以取消现有的标准要求,同时保持实施符合吗?
[1] C11,6.9.2 外部对象定义,3:
如果对象标识符的声明是一个暂定定义并且具有内部链接,则声明的类型不应是不完整的类型。
UPD。是的。换句话说:标准说:“我们不支持这一点,需要诊断”。扩展名说:“我们确实支持这一点(因此,标准所需的诊断是无关紧要的)”。
c - “严格符合程序”+没有扩展是否意味着“没有发出诊断”?
后续问题:clang: <string literal> + <expression returned int> 导致令人困惑的警告:将 'int' 添加到字符串不会附加到字符串。
“严格符合程序”+没有扩展是否意味着“没有发出诊断”?
原因:更好地理解术语“严格符合程序”。
c - 现代 C 标准中是否有 nullptr (或等效项)之类的东西?
nullptr
我在一行 C 代码中包含了一个检查。编译器(gcc)在使用-std=c17
以及-std=gnu17
.
现代 C 标准中是否有 nullptr (或等效项)之类的东西?(C11, C17)
如果不是,那为什么?
c - 如果 'float'<= INT_MAX 为真,那么为什么 (int)'float' 可能会触发未定义的行为?
示例代码(t0.c):
调用:
问题:
- 如果
F
打印为2147483648.000000
,那为什么F <= INT_MAX
是真的? - 在这里避免UB的正确方法是什么?
UPD。解决方案:
UPD2。更好的解决方案: