c++ - 这些浮点属性宏是 GCC 特有的吗?
问题描述
我正在使用 GCC,而我的编译器定义了这些宏:__FLT_RADIX__
, __FLT_MANT_DIG__
, __FLT_MAX_EXP__
, __FLT_HAS_INFINITY__
, __FLT_HAS_QUIET_NAN__
, __FLT_HAS_DENORM__
, ... 它们是 GCC 特有的还是在 C++ 标准中?我的意思是无论它们是否被定义,我知道它们的值是特定于实现的。如果它们不在标准中,我在哪里可以找到所有编译器的等价物?
解决方案
它们是……在 C++ 标准中吗?
不。
它们是否特定于 GCC
它们不在 GCC 文档中,因此也不保证它们在(未来版本的)GCC 中。它们供内部使用(可能用于标准宏和 的可移植实现std::numeric_limits
)。
我在哪里可以找到所有编译器的等价物?
C 标准库中的大多数都有相应的标准宏。只需从开头和结尾删除下划线;例如FLT_RADIX
。FLT_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();
然后在目标系统上编译并运行该元程序以生成用于编译主程序的标头。
推荐阅读
- javascript - 如何将 Rails 控制器值分配给 JavaScript 常量
- python-3.x - 模式包安装失败
- mysql - MySQL:可能的变量生命周期问题,可能的范围问题,老实说不确定
- pandas - 如何创建自己的自定义转换器并在 scikit-learn 的管道中使用它们?
- spring-kafka - Kafka 事务的 Spring Kafka Consumer ACKMODE 和 Producer 缓冲
- security - 估计密码破解时间
- python - 由于数据类型不匹配 PySpark 无法解析列
- java - 用java制作一个基本的游戏,jFrame形式vs jframe
- css - 当我尝试通过样式更改图标颜色时,它保持黑色
- ios - 如何解决 React Native 中 Firebase 的 invalidRegistration 错误