2016-02-08 75 views
3

Visual Studio 2008,調試版本。的C++斷言(真)警告簽名/未簽名不匹配

assert(true); 

此行導致投訴

warning C4365: 'argument' : conversion from 'long' to 'unsigned int', signed/unsigned mismatch 

與任何(有用)布爾表達式替換true時,即使有1ul警告仍然存在。

僅供參考,編譯器的文件assert.h是:

#define assert(_Expression) (void)((!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0)) 
extern "C" _CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line); 

怎麼能這樣的警告可以乾淨抑制,但不影響所有 C4365的?是__LINE__的錯?

回答

5

The bug report explains it very well:發生

此問題的原因是__LINE__類型的長,並且斷言 宏傳遞__LINE__作爲參數傳遞給_wassert功能,這 預計一個unsigned int。當不用/ZI編譯時,__LINE__是一個 的常量表達式,所以編譯器可以靜態地確定轉換爲unsigned int的 將導致相同的值。當 與/ZI編譯時,__LINE__不是一個常量表達式,因此 編譯器無法靜態確定轉換結果將導致 具有相同的值,並且會發出警告C4365。

它也給出了一個解決辦法:

對於這個問題的解決方法,我會建議#undefing在 堅持你的源代碼,並重新#定義-ING它,使用相同的定義如 在<assert.h>中,但用一個強制轉換來抑制警告。

請注意,此錯誤似乎已從MSVC2015開始修復。