简单的 C++ 代码在测试项目中通过,但在主要项目中失败
Trivial C++ code passes in a test project and fails in the main one
这两行代码:
const bool equal = (HUGE_VALF == HUGE_VALF);
static_assert(equal == true, "Fatal error");
在测试程序中运行完美(没有警告也没有错误)。
当我在主项目中复制它们时,我在断言上得到这个错误:
error C2057: expected constant expression
这里的 equal
对象是一个常量,其值为 true
.
这两行代码都在函数内部。
两个项目具有相同的设置(C++11、Visual C++ 2013 编译器、Visual C++ 2019 IDE、/W4,无优化)。
编译器出现这种不同行为的原因可能是什么?
当较新的 Visual Studio IDE(如 VS 2019)首次加载较旧的项目时,它会要求重新定位项目。如果您安装了旧的 Visual Studio,您可以拒绝此操作。那么新的就会使用原来VS的编译器IDE.
加载解决方案后,在项目名称旁边的解决方案资源管理器中,您将拥有将用于编译项目的 Visual Studio。
如果缺少括号,则表示使用了当前 Visual Studio 中的编译器和标准库。
如评论中所述:
I have no parenthesis after the project name (if I am looking in the right place). However, I realised about the issue in the include file paths: Test Project: 14.24.28314\include\cmath; Main Project: Microsoft Visual Studio 12.0\VC\include\cmath, i.e. a much older version, that internally still relies on the C math.h header. So, same compiler (VS2013), different libraries...
这表明您很可能已在 VS 2019 中重新定位项目或创建新项目。
要使 VS 2019 中的项目使用旧版编译器,您需要进入项目属性 -> 配置属性 -> 常规 -> 平台工具集并将其更改为适当的 Visual Studio。
还要确保所有机器类型(32 位、64 位)的所有配置(调试、发布...)都具有相同的设置值。
因为测试项目使用的是 VS 2019 - 它具有所有必需的定义 - 所以它可以工作。
所以问题很可能是,VS 2013 标准库不是 C++11 完整的,并且没有 HUGE_VALF
的定义。
但它可以包含 HUGE_VAL
的定义
这两行代码:
const bool equal = (HUGE_VALF == HUGE_VALF);
static_assert(equal == true, "Fatal error");
在测试程序中运行完美(没有警告也没有错误)。
当我在主项目中复制它们时,我在断言上得到这个错误:
error C2057: expected constant expression
这里的 equal
对象是一个常量,其值为 true
.
这两行代码都在函数内部。
两个项目具有相同的设置(C++11、Visual C++ 2013 编译器、Visual C++ 2019 IDE、/W4,无优化)。
编译器出现这种不同行为的原因可能是什么?
当较新的 Visual Studio IDE(如 VS 2019)首次加载较旧的项目时,它会要求重新定位项目。如果您安装了旧的 Visual Studio,您可以拒绝此操作。那么新的就会使用原来VS的编译器IDE.
加载解决方案后,在项目名称旁边的解决方案资源管理器中,您将拥有将用于编译项目的 Visual Studio。 如果缺少括号,则表示使用了当前 Visual Studio 中的编译器和标准库。
如评论中所述:
I have no parenthesis after the project name (if I am looking in the right place). However, I realised about the issue in the include file paths: Test Project: 14.24.28314\include\cmath; Main Project: Microsoft Visual Studio 12.0\VC\include\cmath, i.e. a much older version, that internally still relies on the C math.h header. So, same compiler (VS2013), different libraries...
这表明您很可能已在 VS 2019 中重新定位项目或创建新项目。
要使 VS 2019 中的项目使用旧版编译器,您需要进入项目属性 -> 配置属性 -> 常规 -> 平台工具集并将其更改为适当的 Visual Studio。
还要确保所有机器类型(32 位、64 位)的所有配置(调试、发布...)都具有相同的设置值。
因为测试项目使用的是 VS 2019 - 它具有所有必需的定义 - 所以它可以工作。
所以问题很可能是,VS 2013 标准库不是 C++11 完整的,并且没有 HUGE_VALF
的定义。
但它可以包含 HUGE_VAL