问题标签 [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.

0 投票
2 回答
111 浏览

c - stdatomic.h 的名称是否与在句点之前映射到八个有效字符的(潜在)限制相矛盾?

ISO/IEC 9899:2011 (E):

6.10.2.5

该实现可以忽略字母大小写的区别,并将映射限制为句点前的八个有效字符。

由于stdatomic.h句号前有 9 个字符,是否与上述(潜在)限制相矛盾?即,当将它们用作指令的参数时,某些实现不会区分stdatomic.h和(例如)?stdatomix.h#include

额外的问题:为什么stdatomic.h而不是atomic.h

0 投票
2 回答
119 浏览

c - 为什么不是所有标准头文件都以 std 前缀开头?

为什么不是所有的标准标题都以std前缀开头?即为什么complex.h而不是stdcomplex.h

0 投票
0 回答
73 浏览

c - 如果次正规数的存在是可选的(HAS_SUBNORM),那么为什么 FP_SUBNORMAL 的存在是强制性的?

如果次正规数的存在是可选的(HAS_SUBNORM特征宏),那么为什么FP_SUBNORMAL分类宏的存在是强制性的?

问题的原因:在这个(仍然没有回答的)问题中得出结论/假设:

如果 HAS_SUBNORM 为 0,则使用手动构造的次正规数表示的输入执行任何FP 操作(通过联合使用类型双关、使用 memcpy、从文件读取等构造)会导致未定义的行为 (UB)。

这个结论/假设导致了多个问题:

  1. 这是否意味着如果HAS_SUBNORM is 0无法使用 C 标准库来检测是否存在例如用户提供的次正规数?

例子:

  1. 是否应该FP_SUBNORMAL依赖于HAS_SUBNORM设置为的宏的析取1?IE:
  1. 分类宏是强制性的这一事实是否FP_SUBNORMAL意味着在使用手动构造的次正规数表示的输入HAS_SUBNORM is 0执行fpclassify宏的情况下将导致明确定义的行为?

UPD 20210527。与舍入模式(C11,7.6.8)相比(强调添加):

当且仅当实现支持通过 fegetround 和 fesetround 函数获取和设置表示的舍入方向时,才会定义每个宏 FE_DOWNWARD ...。

0 投票
1 回答
156 浏览

c - 为什么将“超出范围的整数转换为整数”会导致 IB,但将“超出范围的浮点数转换为整数”会导致 UB?

后续问题:

  1. 类型转换:double to char:多个问题
  2. 将无符号值分配给有符号字符

背景: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 或未指定)。

0 投票
2 回答
89 浏览

c - 我可以在 C17 中将“枚举”变量视为“int”吗?

TL;DR:假设,给定enum NAME {...};,这与执行期间enum NAME n相同吗?即使它被声明为 ,也可以int n像? 原因:我真的想将类型用于返回标志,作为关于位操作的“关闭”类型。nsigned intenum NAMEenum

例如: Let typedef enum FLAGS { F1 = 0x00000001, F2 = 0x00000002, F3 = 0x00000004 } FLAGS ; Then,FLAGS f = F1 | F2;赋值3f,不抛出任何相关的错误或警告。这个和许多其他编译器允许的使用场景,例如f++,让我觉得我可以合法地把f它当作一个signed int. 使用的编译器:MSVC'19, 16.9.1,设置“C17 (2018) Standard (/std:c17)”;

我搜索了标准(这里的草图)并查看了其他相关问题,但没有提到任何可疑(并希望)是 to 的“无声促销” enum NAME xsigned int x即使标识符具有那种类型。这让我相信,enum当分配一个不是成员的值时,行为方式是依赖于实现的。我要求,部分是为了确认或否认这一说法。

0 投票
4 回答
92 浏览

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.

0 投票
1 回答
79 浏览

c - 为什么 QNAN == QNAN 不会导致引发 FE_INVALID 异常?

代码(t125.c):

调用:

问题:为什么QNAN == QNAN不会导致引发FE_INVALID异常?

UPD。问题的原因:(错误,见下文)<any_NAN> == <any_NAN>导致引发FE_INVALID异常的假设。

UPD2。更改代码:从f = *(float*)&qnanf = uqnan.f(通过联合键入双关语)。这是为了避免违反 C 标准的别名规则。

0 投票
1 回答
86 浏览

c - 为什么在 Windows 上运行的 Clang 没有 C 一致性(__STDC__ 未定义为 1)?

示例代码(t127.c):

调用:

问题:

  1. 为什么在 Windows 上运行的 Clang 没有 C 一致性(__STDC__未定义为 1)?即,阻止“在 Windows 上运行的 Clang”定义__STDC__为 1 的(技术)障碍是什么?
  2. 需要指定哪些额外选项才能使 Clang C 在 Windows 上符合要求?
0 投票
0 回答
30 浏览

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

  1.   如果浮点运算不能始终将次正规表示解释为零或非零,则打算将其表征为不确定。

在上面的问题中:

  1. 根据H.2.3.2(浮点运算)除法(divF浮点运算。
  2. 1.0fFLT_MAX是正常数字。

注意:如果省略了行为的明确定义,那么根据 C 标准(ISO/IEC 9899:2011 (E))(强调添加):

未定义的行为在本国际标准中以“未定义的行为”一词或省略任何明确的行为定义来表示

0 投票
0 回答
31 浏览

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-450x1p-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)。