Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 平凡C++;代码在测试项目中通过,在主项目中失败_C++_Visual C++_Static Assert - Fatal编程技术网

C++ 平凡C++;代码在测试项目中通过,在主项目中失败

C++ 平凡C++;代码在测试项目中通过,在主项目中失败,c++,visual-c++,static-assert,C++,Visual C++,Static Assert,下面是两行微不足道的代码: const bool equal = (HUGE_VALF == HUGE_VALF); static_assert(equal == true, "Fatal error"); 在测试程序中工作正常(没有警告和错误) 当我在主项目中复制它们时,我在断言中得到以下错误: 错误C2057:应为常量表达式 这里的equal对象是一个常量,其值=true 在这两种情况下,这些代码行都位于函数内部 两个项目具有相同的设置(C++ 11,Visual C++ 2013编译器,

下面是两行微不足道的代码:

const bool equal = (HUGE_VALF == HUGE_VALF);
static_assert(equal == true, "Fatal error");
在测试程序中工作正常(没有警告和错误)

当我在主项目中复制它们时,我在断言中得到以下错误:

错误C2057:应为常量表达式

这里的
equal
对象是一个常量,其值=
true

在这两种情况下,这些代码行都位于函数内部

两个项目具有相同的设置(C++ 11,Visual C++ 2013编译器,Visual C++ 2019 IDE,/W4,没有优化)。


这种不同于编译器的行为的原因是什么?

当较新的Visual Studio IDE(如VS 2019)首次加载较旧的项目时,它会要求重新确定项目的目标。如果已安装旧的Visual Studio,则可以拒绝此操作。然后,新的IDE将使用来自原始VS的编译器

加载解决方案后,在项目名称旁边的解决方案资源管理器中,您将拥有用于编译项目的Visual Studio。 如果缺少paranthesis,则表示使用了当前Visual Studio中的编译器和标准库

如评论中所述:

我在项目名称后没有括号(如果我找对了位置)。然而,我在include文件路径中意识到了这个问题:测试项目:14.24.28314\include\cmath主项目:Microsoft Visual Studio 12.0\VC\include\cmath,即一个更旧的版本,在内部仍然依赖于C math.h头。所以,相同的编译器(VS2013),不同的库

这表明您很可能在VS 2019中重新确定了项目目标或创建了新项目

要在VS2019中使用较旧的编译器创建项目,您需要进入项目属性->配置属性->常规->平台工具集,并将其更改为相应的Visual Studio

还要确保所有机器类型(32位、64位)的所有配置(调试、发布等)都具有相同的设置值

因为测试项目使用VS2019-它有所有必需的定义-所以它可以工作

所以问题是,VS2013标准库很可能不是C++11完整的,并且没有对
magng_VALF
的定义。
但是它可能包含一个定义,当一个较新的VisualStudioIDE(如VS2019)第一次加载一个较旧的项目时,它会要求重新定位该项目。如果已安装旧的Visual Studio,则可以拒绝此操作。然后,新的IDE将使用来自原始VS的编译器

加载解决方案后,在项目名称旁边的解决方案资源管理器中,您将拥有用于编译项目的Visual Studio。 如果缺少paranthesis,则表示使用了当前Visual Studio中的编译器和标准库

如评论中所述:

我在项目名称后没有括号(如果我找对了位置)。然而,我在include文件路径中意识到了这个问题:测试项目:14.24.28314\include\cmath主项目:Microsoft Visual Studio 12.0\VC\include\cmath,即一个更旧的版本,在内部仍然依赖于C math.h头。所以,相同的编译器(VS2013),不同的库

这表明您很可能在VS 2019中重新确定了项目目标或创建了新项目

要在VS2019中使用较旧的编译器创建项目,您需要进入项目属性->配置属性->常规->平台工具集,并将其更改为相应的Visual Studio

还要确保所有机器类型(32位、64位)的所有配置(调试、发布等)都具有相同的设置值

因为测试项目使用VS2019-它有所有必需的定义-所以它可以工作

所以问题是,VS2013标准库很可能不是C++11完整的,并且没有对
magng_VALF
的定义。
但它可能包含一个定义,即评论不用于扩展讨论;此对话已结束。评论不用于扩展讨论;此对话已结束。我可以确认主项目和测试项目都是Visual Studio 2013(v120)项目,如属性->配置属性->常规->平台工具集所示。但是,测试项目在项目名称附近没有显示(Visual Studio 2013)。@Pietro是否检查了“调试”、“发布”和任何其他配置中的设置?@Pietro例如:调试配置正确,但发布不正确。当前选择的配置为Release。然后看看您是如何描述的。还要记住,每个配置也适用于32位和64位系统,因此默认情况下,所有4个配置都必须更新。@Pietro如果现在您在测试和主项目中遇到相同的问题,这意味着VS 2013不支持您想要执行的操作。我可以确认主项目和测试项目都是Visual Studio 2013(v120)项目,如属性->配置属性->常规->平台工具集所示。但是,测试项目在项目名称附近没有显示(Visual Studio 2013)。@Pietro是否检查了“调试”、“发布”和任何其他配置中的设置?@Pietro例如:调试配置正确,但发布不正确。当前选择的配置为Release。然后看看您是如何描述的。还请记住,每个配置也可用于32位和64位系统,因此默认情况下,所有4个配置都必须更新。@Pietro如果现在您在测试和主项目中遇到相同的问题,这意味着VS 2013不支持您想要做的事情。