Visual Studio 2010 (C ++): временно отключить предупреждение C4706 - PullRequest
12 голосов
/ 08 августа 2011

Когда вы компилируете следующий исходный файл 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 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), не работает - в чем ошибка?

Ответы [ 5 ]

19 голосов
/ 08 августа 2011

Вместо того, чтобы пытаться скрыть свое предупреждение, исправьте проблему, на которую он жалуется ;Ваше назначение имеет значение (значение в левой части назначения), которое может быть юридически использовано в другом выражении.

Это можно исправить, явно протестировав результат назначения:

if ((result = strcmp(str0, str1)) != 0) 
{
    printf("Strings are different\n");
}
14 голосов
/ 08 августа 2011

В 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");
    }
}
8 голосов
/ 08 августа 2011

Разумное решение - переписать условие на

if( (result = strcmp(str0, str1)) != 0 )

, что сообщит любому C компилятору, который вы действительно хотите назначить, и почти навернякагенерировать тот же объектный код.

2 голосов
/ 17 декабря 2015

Существует еще одно решение, которое позволяет избежать предупреждения: оператор запятая .

Основным преимуществом здесь будет то, что вам не нужны круглые скобки, поэтому оно немного короче, чем решение !=0, когда имя вашей переменной короткое.

Например:

if (result = strcmp(str0, str1), result) 
{
    printf("Strings are different\n");
}
1 голос
/ 22 марта 2013

Существует простая конструкция !! для приведения типа к bool.Например:

if (!!(result = strcmp(str0, str1)))

Однако в некоторых случаях прямое сравнение != 0 может быть более понятным для читателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...