Visual Studio 2010 (C++): временно подавить предупреждение C4706
при компиляции следующего исходного файла C++ в Visual Studio 2010 с включенным уровнем предупреждения /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 differentn");
}
}
вы получаете следующее предупреждение
предупреждение 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 differentn");
}
}
Это не помогло.
этот вариант тоже не помог:
#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 differentn");
}
}
чтобы избежать еще одного запроса: я очистил решение перед каждой компиляцией. Так что это, вероятно, не вина.
Итак, в заключение: как я могу подавить C4706 именно при этом место?
редактировать да, переписывание возможно - но я действительно хочу знать, почему способ, которым я пытаюсь подавить предупреждение (которое официально задокументировано на MSDN), не работает - где ошибка?
5 ответов
в MSDN Libray:http://msdn.microsoft.com/en-us/library/2c8f766e (v=VS.100).aspx, есть раздел следующим образом.
для предупреждающих номеров в диапазоне 4700-4999, которые являются связанное с генерацией кода состояние действующего предупреждения когда компилятор встречает открытую фигурную скобку функции, быть в силе для остальной части функции. Использование pragma warning В функции для изменения состояния предупреждения имеет число больше than 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");
}
}
вместо того, чтобы пытаться скрыть предупреждение, fix проблема, на которую он жалуется; ваше назначение имеет значение (значение в левой части назначения), которое может быть законно использовано в другом выражении.
вы можете исправить это, явно Протестировав результат задания:
if ((result = strcmp(str0, str1)) != 0)
{
printf("Strings are different\n");
}
разумным решением является переписать условие на
if( (result = strcmp(str0, str1)) != 0 )
, который будет информировать любой компилятор C, который вы действительно хотите назначить,и почти наверняка создаст тот же объектный код.
есть еще одно решение, которое позволяет избежать предупреждение:оператор запятая.
основным преимуществом здесь будет то, что вам не нужны круглые скобки, поэтому он немного короче, чем !=0
решение, когда имя переменной короткое.
например:
if (result = strcmp(str0, str1), result)
{
printf("Strings are different\n");
}
есть простая конструкция !!
бросить типа bool
. Вот так:
if (!!(result = strcmp(str0, str1)))
однако, в некоторых случаях прямое сравнение != 0
может быть более ясным для читателя.