12

Podczas kompilowania następujące C plik źródłowy ++ w Visual Studio 2010 z poziomu ostrzegawczego/W4 włączonaVisual Studio 2010 (C++): stłumić C4706 ostrzeżenie tymczasowo

#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"); 
    } 
} 

uzyskać następujące ostrzeżenie

warning C4706: przypisanie wewnątrz wyrażenia warunkowego

dla linii 11.

Chcę ukryć to ostrzeżenie dokładnie w tym miejscu. Więc próbowałem Google i znalazłem tę stronę: http://msdn.microsoft.com/en-us/library/2c8f766e(v=VS.100).aspx

więc zmieniłem kod na następujące - w nadziei, że to rozwiąże problem:

#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"); 
    } 
} 

Nie pomogło.

Ten wariant nie pomogło:

#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"); 
    } 
} 

Aby uniknąć jedną dodatkową ofertę: czyściłem rozwiązanie przed każdym kompilacji. To prawdopodobnie nie jest wina.

Podsumowując: w jaki sposób mogę tłumić C4706 dokładnie w tym miejscu?

Edit Tak, przepisywanie jest możliwe - ale naprawdę chcę wiedzieć, dlaczego sposób staram się tłumić ostrzeżenie (który jest oficjalnie udokumentowane na MSDN) nie działa - gdzie jest błąd?

Odpowiedz

14

W MSDN libray: http://msdn.microsoft.com/en-us/library/2c8f766e(v=VS.100).aspx, istnieje sekcja następująco.

Numery ostrzegania w zakresie 4700-4999, które są związane z tymi generowania kodu, stan ostrzeżenia w efekcie kiedy kompilator napotka otwarty nawias klamrowy z funkcji będzie obowiązywać przez resztę funkcji. Za pomocą ostrzeżenia dotyczącego pragma w funkcja zmiany stanu ostrzeżenia, którego numer jest większy, niż niż 4699, zacznie obowiązywać dopiero po zakończeniu funkcji. Poniższy przykład pokazuje poprawne umiejscowienie ostrzeżeń ostrzegawczych na wyłączyć komunikat ostrzegawczy generowania kodu, a następnie go przywrócić.

Tak więc "#pragma warning" działa tylko dla każdej funkcji/metody.

Poniższy kod zawiera więcej szczegółów.

#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

Rozsądny rozwiązaniem jest przepisać warunek

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

który poinformuje dowolny kompilatora C, że naprawdę chcesz przypisać, i jest prawie pewne, aby wygenerować ten sam kod wynikowy.

+2

Większość kompilatorów wdrożenia „Czy na pewno” czynnik poprzez wymaganie dodatkową parę wsporników, życzę MSVC mógł zrobić to samo. – Thomas

19

Zamiast próbować ukryć ostrzeżenie, napraw the issue it's complaining about; przypisanie ma wartość (wartość po lewej stronie przypisania), która może być legalnie użyta w innym wyrażeniu.

Można rozwiązać ten problem poprzez wyraźne testowanie wyniku cesji:

if ((result = strcmp(str0, str1)) != 0) 
{ 
    printf("Strings are different\n"); 
} 
+0

Nie mogę uwierzyć, że o tym nie myślałem. Dziękuję Ci! Def najlepsze rozwiązanie. –

1

Jest to prosta konstrukcja !! rzucić typ do bool. Tak:

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

Jednak w niektórych przypadkach bezpośrednie porównanie != 0 może być bardziej jasne dla czytelnika.

2

Istnieje inne rozwiązanie, które unika ostrzeżenia: comma operator.

Główną zaletą będzie to, że nie potrzebujesz nawiasów, więc jest on nieco krótszy niż rozwiązanie !=0, gdy twoja nazwa zmiennej jest krótka.

Na przykład:

if (result = strcmp(str0, str1), result) 
{ 
    printf("Strings are different\n"); 
}