Visual Studio 2010(C ++):暂时禁止C4706警告

时间:2011-08-08 17:25:38

标签: visual-studio visual-studio-2010 visual-c++ compiler-warnings suppress-warnings

在Visual Studio 2010中编译以下C ++源文件时,警告级别为/ W4

#include <cstdio>  // for printf
#include <cstring> // for strcmp

char str0[] = "Hello";
char str1[] = "World";

int main()
{
    int result;

    if (result = strcmp(str0, str1)) // line 11
    {
        printf("Strings are different\n");
    }
}

您收到以下警告

  

警告C4706:条件表达式中的赋值

第11行

我想在这个地方准确地压制这个警告。所以我尝试了Google并找到了这个页面:http://msdn.microsoft.com/en-us/library/2c8f766e(v=VS.100).aspx

所以我将代码更改为以下内容 - 希望这可以解决问题:

#include <cstdio>  // for printf
#include <cstring> // for strcmp

char str0[] = "Hello";
char str1[] = "World";

int main()
{
    int result;

#pragma warning(push)
#pragma warning(disable : 4706)
    if (result = strcmp(str0, str1))
#pragma warning(pop)
    {
        printf("Strings are different\n");
    }
}

没有用。

此变体也没有帮助:

#include <cstdio>  // for printf
#include <cstring> // for strcmp

char str0[] = "Hello";
char str1[] = "World";

int main()
{
    int result;

#pragma warning(push)
#pragma warning(disable : 4706)
    if (result = strcmp(str0, str1))
    {
#pragma warning(pop)
        printf("Strings are different\n");
    }
}

为了避免进一步的询问:我在每次编译之前清理了解决方案。所以这可能不是错误。

总之:如何在这个地方准确地抑制C4706?

编辑是的,可以重写 - 但我真的想知道为什么我试图压制警告的方式(在MSDN上正式记录)不起作用 - 哪里出错?

5 个答案:

答案 0 :(得分:19)

不要试图隐藏警告,而是修复the issue it's complaining about;你的作业有一个值(作业左侧的值),可以在另一个表达式中合法使用。

您可以通过明确测试分配结果来解决此问题:

if ((result = strcmp(str0, str1)) != 0) 
{
    printf("Strings are different\n");
}

答案 1 :(得分:14)

在MSDN Libray:http://msdn.microsoft.com/en-us/library/2c8f766e(v=VS.100).aspx中,有以下部分。

  

对于4700-4999范围内的警告编号,这些是警告编号   与代码生成相关联,警告的状态有效   当编译器遇到一个函数的开放大括号时   对功能的其余部分有效。使用警告编译指示   用于更改数字较大的警告状态的函数   超过4699只会在功能结束后生效。该   以下示例显示了警告编译指示的正确位置   禁用代码生成警告消息,然后将其还原。

所以'#pragma warning'仅适用于每个函数/方法。

请参阅以下代码以获取更多详细信息。

#include <cstdio>  // for printf
#include <cstring> // for strcmp

char str0[] = "Hello";
char str1[] = "World";

#pragma warning(push)
#pragma warning( disable : 4706 )
void func()
{
    int result;
    if (result = strcmp(str0, str1)) // No warning
    {
        printf("Strings are different\n");
    }
#pragma warning(pop)
}

int main()
{
    int result;

    if (result = strcmp(str0, str1)) // 4706 Warning.
    {
        printf("Strings are different\n");
    }
}

答案 2 :(得分:8)

理智的解决方案是将条件重写为

if( (result = strcmp(str0, str1)) != 0 )

将通知您真正想要分配的任何 C编译器,几乎肯定会生成相同的目标代码。

答案 3 :(得分:2)

还有另一种避免警告的解决方案:comma operator

这里的主要优点是您不需要括号,因此当您的变量名称很短时,它比!=0解决方案稍短。

例如:

if (result = strcmp(str0, str1), result) 
{
    printf("Strings are different\n");
}

答案 4 :(得分:1)

有一个简单的构造!!可以将类型转换为bool。像这样:

if (!!(result = strcmp(str0, str1)))

但是,在某些情况下,读者可能会更直接地比较!= 0