12

當您編譯在Visual Studio 2010中使用以下C++源文件級警告/ W4啓用的Visual Studio 2010(C++):抑制C4706警告暫時

#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

我想在這個地方準確地壓制這個警告。所以,我想谷歌和找到了這個網頁: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上正式記錄)不起作用 - 錯誤在哪裏?

回答

14

在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

理智的解決辦法是條件重寫

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

將通知任何 C編譯器,你真的要分配,幾乎肯定會產生相同的目標代碼。

+2

大多數編譯器實現通過要求一對額外的括號的「你確定」的因素,我希望MSVC可以做同樣的。 – Thomas

19

而不是試圖隱藏您的警告,修復the issue it's complaining about;你的賦值有一個值(賦值左側的值),可以在另一個表達式中合法使用。

您可以明確地測試分配的結果解決這個問題:

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

我不敢相信我沒有想到這一點。謝謝!確定最佳解決方案。 –

1

有一個簡單的結構!!投下類型bool。像這樣:

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

但是,在某些情況下,直接比較!= 0可能會更清楚的讀者。

2

還有另一種避免警告的解決方案:comma operator

這裏的主要優點是您不需要括號,因此當您的變量名稱短時,它比!=0解決方案稍短。

例如:

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