Visual Studio 2010 (С++): временно отключить C4706
Когда вы компилируете следующий исходный файл С++ в 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 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), не работает - где ошибка?
Ответы
Ответ 1
В 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
Вместо того, чтобы скрывать свое предупреждение, исправьте проблему, о которой он жалуется; ваше задание имеет значение (значение в левой части задания), которое может быть юридически использовано в другом выражении.
Вы можете исправить это, явно проверив результат присваивания:
if ((result = strcmp(str0, str1)) != 0)
{
printf("Strings are different\n");
}
Ответ 3
Разумным решением является переписать условие на
if( (result = strcmp(str0, str1)) != 0 )
который будет информировать любого компилятора C, который вы действительно хотите назначить, и почти наверняка будет генерировать один и тот же объектный код.
Ответ 4
Существует еще одно решение, которое позволяет избежать предупреждения: запятая.
Основное преимущество здесь заключается в том, что вам не нужны скобки, поэтому он немного короче, чем решение !=0
, когда ваше имя переменной короткое.
Например:
if (result = strcmp(str0, str1), result)
{
printf("Strings are different\n");
}
Ответ 5
Для построения типа bool
существует простая конструкция !!
. Вот так:
if (!!(result = strcmp(str0, str1)))
Однако в некоторых случаях прямое сравнение != 0
может быть более понятным для читателя.