最近的 MSVC 版本不将 NAN 视为常量,有解决方法吗?

问题描述 投票:0回答:1

最近的 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 中的错误还是有效行为?
  • 什么是不会破坏其他编译器代码的可靠解决方法?

显然,MSVC 也不接受

0.0 / 0.0
。代码
double f() { return 0.0 / 0.0; }
失败并显示
error C2124: divide or mod by zero

编辑:这个问题已作为一个明显不同问题的重复而被关闭。 StackOverflow 仍然要求我进行编辑才能重新打开。

c visual-c++ c99
1个回答
0
投票

这是 MSVC 中的一个错误。

NAN
宏必须是常量表达式。 文件范围初始值设定项中允许此类表达式,因为它们可以在编译时求值。

这是 C99 标准第 7.12p6 节中强制规定的

宏观

NAN

当且仅当实现支持安静 NaN 时才被定义

float
类型。 它扩展为
float
类型的常量表达式 代表一个安静的 NaN。

C11 和 C23 中存在相同的语言。

这是 MSVC 首次表现出不符合标准的行为。

© www.soinside.com 2019 - 2024. All rights reserved.