在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");
}
}
您收到以下警告
第11行警告C4706:条件表达式中的赋值
。
我想在这个地方准确地压制这个警告。所以我尝试了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上正式记录)不起作用 - 哪里出错?
答案 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
。