问题标签 [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 - stdatomic.h 的名称是否与在句点之前映射到八个有效字符的(潜在)限制相矛盾?
ISO/IEC 9899:2011 (E):
6.10.2.5
该实现可以忽略字母大小写的区别,并将映射限制为句点前的八个有效字符。
由于stdatomic.h
句号前有 9 个字符,是否与上述(潜在)限制相矛盾?即,当将它们用作指令的参数时,某些实现不会区分stdatomic.h
和(例如)?stdatomix.h
#include
额外的问题:为什么stdatomic.h
而不是atomic.h
?
c - 为什么不是所有标准头文件都以 std 前缀开头?
为什么不是所有的标准标题都以std
前缀开头?即为什么complex.h
而不是stdcomplex.h
?
c - 如果次正规数的存在是可选的(HAS_SUBNORM),那么为什么 FP_SUBNORMAL 的存在是强制性的?
如果次正规数的存在是可选的(HAS_SUBNORM
特征宏),那么为什么FP_SUBNORMAL
分类宏的存在是强制性的?
问题的原因:在这个(仍然没有回答的)问题中得出结论/假设:
如果 HAS_SUBNORM 为 0,则使用手动构造的次正规数表示的输入执行任何FP 操作(通过联合使用类型双关、使用 memcpy、从文件读取等构造)会导致未定义的行为 (UB)。
这个结论/假设导致了多个问题:
- 这是否意味着如果
HAS_SUBNORM is 0
无法使用 C 标准库来检测是否存在例如用户提供的次正规数?
例子:
- 是否应该
FP_SUBNORMAL
依赖于HAS_SUBNORM
设置为的宏的析取1
?IE:
- 分类宏是强制性的这一事实是否
FP_SUBNORMAL
意味着在使用手动构造的次正规数表示的输入HAS_SUBNORM is 0
执行fpclassify
宏的情况下将导致明确定义的行为?
UPD 20210527。与舍入模式(C11,7.6.8)相比(强调添加):
当且仅当实现支持通过 fegetround 和 fesetround 函数获取和设置表示的舍入方向时,才会定义每个宏 FE_DOWNWARD ...。
c - 为什么将“超出范围的整数转换为整数”会导致 IB,但将“超出范围的浮点数转换为整数”会导致 UB?
后续问题:
背景:ISO/IEC 9899:202x (E) 工作草案 — 2020 年 2 月 5 日 C17..C2x N2479(已添加重点):
J.3实现定义的行为,J.3.5 整数
— 当值不能在该类型的对象中表示时,将整数转换为有符号整数类型的结果或产生的信号(6.3.1.3)。
6.3.1.4 实数浮点数和整数
当标准浮点类型的有限值转换为 _Bool 以外的整数类型时,小数部分被丢弃(即,该值被截断为 0)。如果整数部分的值不能用整数类型表示,则行为未定义。
问题:为什么将“超出范围的整数转换为整数”会导致 IB,但将“超出范围的浮点数转换为整数”会导致 UB?即为什么行为不一致(例如两种情况下的IB)?
UPD。用户 PP 在重复问题中的回答:
我怀疑它是否可以合理回答。这主要是因为历史,并且基于C标准化时的实现,硬件行为等。所以“一致性”是不可能的/不切实际的(这不像委员会决定任意将某些行为归类为 IB、UB 或未指定)。
c - 我可以在 C17 中将“枚举”变量视为“int”吗?
TL;DR:假设,给定enum NAME {...};
,这与执行期间enum NAME n
相同吗?即使它被声明为 ,也可以int n
像? 原因:我真的想将类型用于返回标志,作为关于位操作的“关闭”类型。n
signed int
enum NAME
enum
例如: Let typedef enum FLAGS { F1 = 0x00000001, F2 = 0x00000002, F3 = 0x00000004 } FLAGS ;
Then,FLAGS f = F1 | F2;
赋值3
给f
,不抛出任何相关的错误或警告。这个和许多其他编译器允许的使用场景,例如f++
,让我觉得我可以合法地把f
它当作一个signed int
. 使用的编译器:MSVC'19, 16.9.1,设置“C17 (2018) Standard (/std:c17)”;
我搜索了标准(这里的草图)并查看了其他相关问题,但没有提到任何可疑(并希望)是 to 的“无声促销” enum NAME x
,signed int x
即使标识符具有那种类型。这让我相信,enum
当分配一个不是成员的值时,行为方式是依赖于实现的。我要求,部分是为了确认或否认这一说法。
c - C标准:结构和联合说明符:“适当转换”的确切定义是什么?
N2479 C17..C2x 工作草案 — 2020 年 2 月 5 日 ISO/IEC 9899:202x (E)(已添加重点):
6.7.2.1 结构和联合说明符
17 在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在其开头。
18 工会的规模足以容纳其最大的成员。任何时候最多可以将其中一个成员的值存储在联合对象中。一个指向联合对象的指针,经过适当的转换,指向它的每个成员(或者如果一个成员是一个位域,那么指向它所在的单元),反之亦然。
问题: 的确切定义是suitably converted
什么?
额外:如果没有确切的定义suitably converted
,那么 C 实现应该记录它的理解吗?例如(C/C++ 预处理器域),微软将术语single item
(C++,N4713)理解为single, permanently indivisible preprocessor token
(这会导致从 gcc/clang/other 移植代码时出现问题,这有不同的理解),但是,他们似乎没有记录他们对single item
.
c - 为什么 QNAN == QNAN 不会导致引发 FE_INVALID 异常?
代码(t125.c):
调用:
问题:为什么QNAN == QNAN
不会导致引发FE_INVALID
异常?
UPD。问题的原因:(错误,见下文)<any_NAN> == <any_NAN>
导致引发FE_INVALID
异常的假设。
UPD2。更改代码:从f = *(float*)&qnan
到f = uqnan.f
(通过联合键入双关语)。这是为了避免违反 C 标准的别名规则。
c - 为什么在 Windows 上运行的 Clang 没有 C 一致性(__STDC__ 未定义为 1)?
示例代码(t127.c):
调用:
问题:
- 为什么在 Windows 上运行的 Clang 没有 C 一致性(
__STDC__
未定义为 1)?即,阻止“在 Windows 上运行的 Clang”定义__STDC__
为 1 的(技术)障碍是什么? - 需要指定哪些额外选项才能使 Clang C 在 Windows 上符合要求?
c - 如果 FLT_HAS_SUBNORM 为 -1,那么 1.0f / FLT_MAX 是否会产生次正规数或导致未定义行为(UB)?
问题:如果FLT_HAS_SUBNORM
是-1,那么会1.0f / FLT_MAX
产生次正规数吗?
ISO/IEC 9899:2011 (E):
-1 不确定25
- 如果浮点运算不能始终将次正规表示解释为零或非零,则打算将其表征为不确定。
在上面的问题中:
- 根据H.2.3.2(浮点运算)除法(divF)是浮点运算。
- 值
1.0f
和FLT_MAX
是正常数字。
注意:如果省略了行为的明确定义,那么根据 C 标准(ISO/IEC 9899:2011 (E))(强调添加):
未定义的行为在本国际标准中以“未定义的行为”一词或省略任何明确的行为定义来表示。
c - 如果 FLT_HAS_SUBNORM 为 0,那么转换 (float)1E-45 是否应返回 0x1p-149?
简单的问题:如果FLT_HAS_SUBNORM
是 0,那么转换应该(float)1E-45
返回0x1p-149
吗?
问题的原因:ISO/IEC 9899:2011 (E) 指定了FLT_HAS_SUBNORM
/ DBL_HAS_SUBNORM
only wrt floating-point operations 的行为。根据 H.2.3.2(浮点运算),浮点精度(取自 F.3 运算符和函数的术语)之间的转换不是浮点运算。因此,为FLT_HAS_SUBNORM
/指定的行为与浮点精度之间DBL_HAS_SUBNORM
的转换无关。因此,结论是转换将返回。这个结论正确吗?(float)1E-45
0x1p-149
UPD:解释这些问题的原因:目前我有一些测试来测试 FP 操作生成的结果的正确性(包括转换)。FLT_HAS_SUBNORM is 0
我在使用和 的环境下运行这些测试FLT_HAS_SUBNORM is -1
。主要问题是在编译器选项的某些组合中,某些测试失败了。例如:在FLT_HAS_SUBNORM is 0
:
- 硬件(FPU)FP:
(float)1E-45
返回0x1p-149f
- SW (libfp) FP:
(float)1E-45
返回0.0f
测试参考值:0.0f
.
因此,有必要了解是否:
- 测试有一个错误(写错了:例如,没有检查
HAS_SUBNORM
);或者 - 编译器有错误;或者
- SW (libfp) FP 有一个错误;或者
- HW (FPU) FP 有一个错误(模拟器中的错误;它也会发生);或者
- 先前案例的所有可能组合。
第一步是阅读标准(C / IEEE 754)并尝试回答开放性问题。然而,事实证明,wrt FP 的许多方面都没有明确定义。因此,处理现有失败测试的情况的最合理方法是什么?
另请注意,理想情况下,测试是以“通用方式”独立编写的(检查系统/环境的功能:检查功能宏、检查限制等),即不知道特定编译器的特定 FP 细节用于 FP 计算(或者人们称之为FP environment)。