2016-02-08 7 views
3

Visual Studio 2008, debug build. Эта линия C++assert (true) предупреждает о несоответствии подписанного/неподписанного

assert(true); 

вызывает данной жалобу

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

предупреждение сохраняется при замене true с любым (полезным) логическим выражением, даже с 1ul.

FYI, файл компилятора 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, которая ожидает без знака Int. Когда не компилируется с /ZI, __LINE__ является постоянным выражением , поэтому компилятор может статически определять, что преобразование в unsigned int приведет к тому же значению. Когда компиляция с /ZI, __LINE__ не является постоянным выражением, поэтому компилятор не может статически определить, что преобразование приведет к с тем же значением и выдает предупреждение C4365.

Это также дает обходной путь:

В качестве временного решения для этого вопроса, я бы рекомендовал #undefing утверждать в исходного кода и повторно # Определяет-ный его, используя такое же определение как в <assert.h>, но с приложением для подавления предупреждения.

Обратите внимание, что эта ошибка, по-видимому, исправлена, начиная с MSVC2015.

 Смежные вопросы

  • Нет связанных вопросов^_^