最近的 MSVC 版本似乎不再将
NAN
视为常量。新的定义似乎是(__ucrt_int_to_float(0x7FC00000))
。旧的是(-(float)(((float)(1e+300 * 1e+300)) * 0.0F))
。
这会导致如下代码无法使用
error C2099: initializer is not a constant
: 进行编译
#include <math.h>
double x[] = { 1.0, NAN };
不幸的是,我无法直接访问 MSVC,我正在通过 GitHub CI 处理此问题。
问题:
显然,MSVC 也不接受
0.0 / 0.0
。代码 double f() { return 0.0 / 0.0; }
失败并显示 error C2124: divide or mod by zero
编辑:这个问题已作为一个明显不同问题的重复而被关闭。 StackOverflow 仍然要求我进行编辑才能重新打开。
这是 MSVC 中的一个错误。
NAN
宏必须是常量表达式。 文件范围初始值设定项中允许此类表达式,因为它们可以在编译时求值。
宏观
NAN
当且仅当实现支持安静 NaN 时才被定义
类型。 它扩展为float
类型的常量表达式 代表一个安静的 NaN。float
C11 和 C23 中存在相同的语言。
这是 MSVC 首次表现出不符合标准的行为。