Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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++ VS2017中未生成警告_C++_Visual Studio_Visual Studio 2013_Visual Studio 2017 - Fatal编程技术网

C++ VS2017中未生成警告

C++ VS2017中未生成警告,c++,visual-studio,visual-studio-2013,visual-studio-2017,C++,Visual Studio,Visual Studio 2013,Visual Studio 2017,在我看来,VS2017未能捕捉到一些相当明显的编译器警告,而旧版本则没有。这对我来说是如此重要,以至于我猜问题一定是我遗漏了什么(例如,可能是一些新的默认编译器设置?)。还有谁见过这个吗 为了测试这一点,我在2013年和2017年创建了一个简单的控制台应用程序。我对项目设置所做的唯一更改是将编译器警告级别设置为4,并将警告报告为错误。下面是源代码的全部内容 在VS2013中,这失败了。2017年,它建造得很好 // TestWarning4127.cpp : Defines the entry

在我看来,VS2017未能捕捉到一些相当明显的编译器警告,而旧版本则没有。这对我来说是如此重要,以至于我猜问题一定是我遗漏了什么(例如,可能是一些新的默认编译器设置?)。还有谁见过这个吗

为了测试这一点,我在2013年和2017年创建了一个简单的控制台应用程序。我对项目设置所做的唯一更改是将编译器警告级别设置为4,并将警告报告为错误。下面是源代码的全部内容

在VS2013中,这失败了。2017年,它建造得很好

// TestWarning4127.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>


int main()
{
    if (true)   // *** SHOULD generate warning 4127
        std::cout << "Warning";

    return 0;
}
//TestWarning4127.cpp:定义控制台应用程序的入口点。
//
#包括“stdafx.h”
#包括
int main()
{
如果(真)/***应生成警告4127

std::cout当在
if
中使用时,而
条件下,诸如
1
true
等琐碎常数不会在VS 2017中产生警告,如官方文件所述。摘自官方文件:

if语句或while循环的控制表达式计算 由于它们惯用的用法,琐碎的 常量(如1或true)不会触发警告,除非 是表达式中操作的结果

也就是说,默认警告级别为W3的VS 2013也不是警告。只有在提升了W4设置的情况下,VS 2013才会报告警告。它在VS 2017中被完全删除

为了进行比较,GCC也不会生成警告:
.

优化是否在这里发挥作用?不确定这是否能解释行为变化。@ChrisO这也是我的想法,警告只有在前端完成后才会出现。这样明显的优化可能会在AST之前出现。我不得不说不。它不会在2013年的调试或发布中生成。这是不可能的ILD在调试和2017年发布时都很好,我实际上在一个更大的代码库中注意到了这一点,我被迫在4个不同版本的Visual Studio(2012、2013、2015和2017)中构建了这个代码库.我已经在2017版本上工作了几个月,有一段时间没有构建旧版本,然后又回到了他们那里,遇到了像这样的小错误,我在2017的代码中没有看到。这就是为什么我首先要编写这个测试。但我在想,我不可能成为第一个测试者看到这一点,我肯定错过了一些东西……为什么这应该是一个警告?
如果(true)
是idfiomatic enough谢谢。我应该自己找到的。为我辩护,我尝试去文档(即点击“F1”)对于4127,我只在VS2013的IDE中使用,并且被带到了另一个链接。我应该在2017年也这样做。我知道它一定是这样的。