gpt4 book ai didi

c - __STDC_IEC_559__ 与现代 C 编译器的状态

转载 作者:太空狗 更新时间:2023-10-29 16:23:53 38 4
gpt4 key购买 nike

C99 添加了宏__STDC_IEC_559__,可用于测试编译器和标准库是否符合 ISO/IEC/IEEE 60559(或 IEEE 754)标准。

根据这个问题的答案
how-to-check-that-ieee-754-single-precision-32-bit-floating-point-representation大多数 C 编译器不设置预处理器宏 __STDC_IEC_559__

According to GCC's documentation它没有定义 __STDC_IEC_559__

我用 GCC 4.9.2 和 Clang 3.6.0 测试了这个,都使用了 glibc 2.21,使用了下面的代码。

//test.c 
//#include <features.h>
int main(void) {
#if defined ( __STDC_IEC_559__ )
//#if defined ( __GCC_IEC_559__ )
return 1;
#else
return 0;
#endif
}

然后

echo $?

这表明使用此代码 __STDC_IEC_559__ 是使用 GCC 定义的,而不是使用 Clang 定义的。然后我执行了 gcc -E,它显示包含文件 stdc-predef.h。此文件定义了 __STDC_IEC_559__

/* glibc's intent is to support the IEC 559 math functionality, real
and complex. If the GCC (4.9 and later) predefined macros
specifying compiler intent are available, use them to determine
whether the overall intent is to support these features; otherwise,
presume an older compiler has intent to support these features and
define these macros by default. */

#ifdef __GCC_IEC_559
# if __GCC_IEC_559 > 0
# define __STDC_IEC_559__ 1
# endif
#else
# define __STDC_IEC_559__ 1
#endif

这证实是 glibc 定义了这个宏,而不是 GCC。

但是,当我包含 features.h(或 stdio.h)时,Clang 也会包含此文件并且 __STDC_IEC_559__ 是定义。

所以 __STDC_IEC_559__ 由 GCC 和 Clang(带有 glibc 头文件)定义,这似乎不同意我链接到的第一个问题的答案。

然后我测试了musl (例如 musl-gcc -test.c)这是一个不同于 glibc 的标准库。这表明 __STDC_IEC_559__ 没有用 musl 定义。

据我了解,标准 C 库没有定义基本的浮点代数。例如,标准 C 库没有定义 1.0/-0.0 的结果。这是由编译器定义的。

我的问题是(按对我的重要性排序):

  1. 为什么 __STDC_IEC_559__ 是由 glibc 而不是编译器定义的?
  2. 如果我创建了自己的标准库并且我想定义 __STDC_IEC_559__ 我需要知道编译器已经符合 IEEE 754 标准库中未定义的操作(例如 1.0/-0.0).是否有针对此的文档或用于测试此的宏?
  3. Wikipedia states that “用户应该知道这个宏 (__STDC_IEC_559__) 有时会被定义,但它不应该被定义”。这个说法仍然准确吗?

最佳答案

  1. 我相信 __STDC_IEC_559__ 依赖于某些库功能,不能仅由编译器定义。参见 this post一些信息。这对于 C 并不少见——编译器和 C 库有时必须合作才能实现整个标准。

  2. 您要问的内容取决于编译器。我认为您必须对编译器有特殊的了解才能做出决定。在GCC的具体情况下,它定义了一个宏来告诉你。搜索 this node of the manual适用于 __GCC_IEC_559

  3. 嗯...我不知道这个问题的答案:-)。原始帖子似乎表明,是的,如果 GCC 打算实现 IEEE 754,它可能会定义 __GCC_IEC_559,即使它实际上并没有这样做。

关于c - __STDC_IEC_559__ 与现代 C 编译器的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31181897/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com