首页 > 解决方案 > 这些浮点属性宏是 GCC 特有的吗?

问题描述

我正在使用 GCC,而我的编译器定义了这些宏:__FLT_RADIX__, __FLT_MANT_DIG__, __FLT_MAX_EXP__, __FLT_HAS_INFINITY__, __FLT_HAS_QUIET_NAN__, __FLT_HAS_DENORM__, ... 它们是 GCC 特有的还是在 C++ 标准中?我的意思是无论它们是否被定义,我知道它们的值是特定于实现的。如果它们不在标准中,我在哪里可以找到所有编译器的等价物?

标签: c++floating-pointmacros

解决方案


它们是……在 C++ 标准中吗?

不。

它们是否特定于 GCC

它们不在 GCC 文档中,因此也不保证它们在(未来版本的)GCC 中。它们供内部使用(可能用于标准宏和 的可移植实现std::numeric_limits)。

我在哪里可以找到所有编译器的等价物?

C 标准库中的大多数都有相应的标准宏。只需从开头和结尾删除下划线;例如FLT_RADIXFLT_HAS_SUBNORM如您所见,一个例外是名称不同。有关宏的完整列表,请参阅标准。

__FLT_HAS_QUIET_NAN__或没有标准宏__FLT_HAS_INFINITY__。但是信息(包括其他信息)在std::numeric_limits模板中。


我需要在预处理器中使用这些值

它有一种在预处理器中使用 std::numiric_limits 常量的方法

你可以使用元编程。编写一个程序,生成带有自定义宏定义的头文件。就像是

std::cout << "#define MY_CUSTOM_FLT_HAS_QUIET_NAN "
          << std::numeric_limits<float>::has_quiet_NaN();

然后在目标系统上编译并运行该元程序以生成用于编译主程序的标头。


推荐阅读