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 может быть более ясным для читателя.