Подтвердить что ты не робот

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), не работает - где ошибка?

4b9b3361

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