2016-02-08 3 views
3

Visual Studio 2008, version de débogage. Cette ligne de C++assert (true) avertit de la non concordance signée/non signée

assert(true); 

provoque la plainte

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

L'avertissement persiste lors du remplacement true avec un (utile) expression booléenne, même avec 1ul.

Pour votre information, le fichier du compilateur assert.h est:

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

Comment cet avertissement être supprimé proprement, sans supprimer tous C4365 de? Est-ce la faute de __LINE__ ??

Répondre

5

The bug report explains it very well:

Ce problème se produit parce que __LINE__ est de type long, et la macro assert passe __LINE__ comme argument à la fonction _wassert qui attend un entier non signé. Lorsqu'elle ne compile pas avec /ZI, __LINE__ est une expression constante , de sorte que le compilateur peut déterminer de façon statique que la conversion en entier non signé aboutira à la même valeur. Lorsque compilant avec /ZI, __LINE__ n'est pas une expression constante, le compilateur ne peut pas déterminer statiquement que la conversion entraînera dans la même valeur et il émet l'avertissement C4365.

Il donne également une solution de contournement:

En tant que solution à ce problème, je recommanderais #undefing affirmer votre code source et re #define-tion, en utilisant la même définition comme dans <assert.h>, mais avec une distribution pour supprimer l'avertissement.

Notez que ce bogue semble avoir été corrigé à partir de MSVC2015.