Подтвердить что ты не робот

Что происходит с тысячами предупреждений в стандартных заголовках в MSVC -Wall?

Некоторые люди, похоже, советуют вам использовать -Wall, но когда я это сделал в небольшом тестовом проекте, в котором есть только main.cpp с некоторыми из них, я получаю 5800 предупреждений, большинство из которых находятся в стандартных заголовках или в заголовках окон.

Это намеренное поведение? Как мне сделать бесплатное уведомление о компиляции?

Вот лишь некоторые из немногих для чтения:

1>c:\program files\microsoft visual studio 10.0\vc\include\stdint.h(105): warning C4668: '_INTPTR' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(109): warning C4820: '_wfinddata64i32_t' : '4' bytes padding added after data member '_wfinddata64i32_t::attrib'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(114): warning C4820: '_wfinddata64i32_t' : '4' bytes padding added after data member '_wfinddata64i32_t::name'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(118): warning C4820: '_wfinddata64_t' : '4' bytes padding added after data member '_wfinddata64_t::attrib'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(488): warning C4820: '_stat32' : '2' bytes padding added after data member '_stat32::st_gid'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(504): warning C4820: 'stat' : '2' bytes padding added after data member 'stat::st_gid'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(520): warning C4820: '_stat32i64' : '2' bytes padding added after data member '_stat32i64::st_gid'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(521): warning C4820: '_stat32i64' : '4' bytes padding added after data member '_stat32i64::st_rdev'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(525): warning C4820: '_stat32i64' : '4' bytes padding added after data member '_stat32i64::st_ctime'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(534): warning C4820: '_stat64i32' : '2' bytes padding added after data member '_stat64i32::st_gid'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(548): warning C4820: '_stat64' : '2' bytes padding added after data member '_stat64::st_gid'
1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(549): warning C4820: '_stat64' : '4' bytes padding added after data member '_stat64::st_rdev'
1>c:\program files\microsoft visual studio 10.0\vc\include\crtdbg.h(1078): warning C4986: 'operator new[]': exception specification does not match previous declaration
1>          c:\program files\microsoft visual studio 10.0\vc\include\new(79) : see declaration of 'operator new[]'
1>c:\program files\microsoft visual studio 10.0\vc\include\crtdbg.h(1095): warning C4986: 'operator delete[]': exception specification does not match previous declaration
1>          c:\program files\microsoft visual studio 10.0\vc\include\new(77) : see declaration of 'operator delete[]'
1>c:\program files\microsoft visual studio 10.0\vc\include\typeinfo(76): warning C4820: 'type_info' : '3' bytes padding added after data member 'type_info::_M_d_name'
1>c:\program files\microsoft sdks\windows\v7.0a\include\basetsd.h(114): warning C4668: '__midl' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8154): warning C4820: '_SECURITY_QUALITY_OF_SERVICE' : '2' bytes padding added after data member '_SECURITY_QUALITY_OF_SERVICE::EffectiveOnly'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8165): warning C4820: '_SE_IMPERSONATION_STATE' : '2' bytes padding added after data member '_SE_IMPERSONATION_STATE::EffectiveOnly'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8334): warning C4820: '_QUOTA_LIMITS' : '4' bytes padding added after data member '_QUOTA_LIMITS::PagefileLimit'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8357): warning C4820: '_QUOTA_LIMITS_EX' : '4' bytes padding added after data member '_QUOTA_LIMITS_EX::PagefileLimit'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8405): warning C4820: '_JOBOBJECT_BASIC_LIMIT_INFORMATION' : '4' bytes padding added after data member '_JOBOBJECT_BASIC_LIMIT_INFORMATION::SchedulingClass'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8984): warning C4820: '_FILE_NOTIFY_INFORMATION' : '2' bytes padding added after data member '_FILE_NOTIFY_INFORMATION::FileName'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(9012): warning C4820: '_REPARSE_GUID_DATA_BUFFER' : '3' bytes padding added after data member '_REPARSE_GUID_DATA_BUFFER::GenericReparseBuffer'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(10131): warning C4820: '<unnamed-tag>' : '3' bytes padding added after data member '<unnamed-tag>::Data'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(10241): warning C4820: '<unnamed-tag>' : '4' bytes padding added after data member '<unnamed-tag>::DecreaseTime'
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(10262): warning C4820: '<unnamed-tag>' : '4' bytes padding added after data member '<unnamed-tag>::TimerInterval' 
1>c:\program files\microsoft sdks\windows\v7.0a\include\wincrypt.h(1440): warning C4668: 'NTDDI_WINLH' is not defined as a preprocessor macro, replacing with '0' for '#if/
4b9b3361

Ответ 1

Visual С++ /Wall включает все предупреждения, которые по умолчанию отключены в /W4. Как вы узнали, есть веская причина, по которой многие из этих предупреждений по умолчанию отключены (спасибо, компилятор, за то, что вы сказали, что добавили отступы, я действительно ценю это!). Вероятно, лучше всего использовать /W4 на Visual С++.

Intel С++ похож на это тоже (я не знаю о других компиляторах, которые используют интерфейс EDG). Если вы установите его на /W5, он извергает массу информационных сообщений. Мой личный фаворит заключается в том, что он предупреждает вас, если спецификатор класса хранения не находится в начале объявления (поэтому const static int не идет, но static const int в порядке).

Ответ 2

Чтобы отключить предупреждения от системных заголовков, над которыми у вас нет контроля, просто используйте эту конструкцию:

#pragma warning(push, 0)       
//Some includes with unfixable warnings
#pragma warning(pop)

или более избирательно для конкретных предупреждений:

#pragma warning( push )
#pragma warning( disable : 4081)
#pragma warning( disable : 4706 )
// system header includes 
#pragma warning( pop )

Этот ответ был украден из другого потока: (fooobar.com/questions/107647/...).

Я полностью согласен с комментариями "edA-qa mort-ora-y". Я хочу видеть все предупреждения в моем коде, включая такие важные вещи, как C4265 (DTOR не виртуальный). Хотя C4265 находится на уровне предупреждения 3, Microsoft по своему разумению отключила его по умолчанию, и вам нужен /Wall, чтобы получить его. Смотрите эту страницу для получения дополнительной информации о том, какие предупреждения скрыты:

http://msdn.microsoft.com/en-GB/library/23k5d385(v=vs.80).aspx

Чтобы увидеть их и подавить шум от внешних заголовков, эта страница дает отличный совет, и я думаю, что полностью отвечает на оригинальный вопрос, который начал эту тему:

http://blogs.msdn.com/b/vcblog/archive/2010/12/14/off-by-default-compiler-warnings-in-visual-c.aspx

По сути, он советует создать "глобальный" включаемый файл с соответствующими #pragmas, чтобы подавить предупреждения, которые вас не интересуют (может быть, C4820 с отступом), для защиты от внешних заголовков, как описано выше, затем выполнить компиляцию с/Стена. Это часть работы, но оно того стоит. При GCC это будет просто вопрос использования -isystem. Разработка Microsoft: обратите внимание! VS - умный продукт, но иногда он просто глуп.

Ответ 3

Я знаю, что это уже поздно, но я считаю, что у меня есть способ использовать /Wall для ваших собственных файлов, но not должен видеть шум от Microsoft или других "внешних" заголовков, Предполагается, что вы используете предварительно скомпилированные заголовки через stdafx.h.

  • Для проекта установите уровень предупреждения на /Wall (максимальные предупреждения)
  • Для файла stdafx.cpp установите уровень предупреждения в /W 4 (много предупреждений включены, но заголовки MS проходят молча).
  • Для проекта в разделе "Отключить специальные предупреждения" добавьте 4652

Первые два кажутся очевидными. Но когда stdafx.h включен в ваши собственные файлы, уровни предупреждения не совпадают и выдается предупреждение C4652. Это поражает все упражнение. Но теперь это сообщение также подавлено.

Это утомительно делать это для каждого нового проекта, но не так плохо, как множество индивидуальных запретов #pragma warning().

Ответ 4

Для MSVC используйте /W4.

Ответ 5

в MSVC 2010

Опции

Свойства коннекции

C/С++

Дополнительно

Отключить специальные предупреждения

установите значение, подобное 4820; 4996; 4514; 4710 для объяснения отключите предупреждения, которые вы считаете несущественными. В этот момент вы можете -WALL не беспокоиться

Ответ 6

У меня такая же первоначальная проблема при компиляции различных стеков программного обеспечения с VC6 и Microsoft Platform SDK (например, в BaseTsd.h).

Что я (мы) хотим сделать, это контролировать уровень предупреждения компилятора для нашего кода - мы хотим иметь возможность играть с флагом /W. На практике, как уже указывалось, /W 4 разрешает все общедоступные предупреждения (а также некоторые ложные...).

Поскольку проблема возникает из файлов заголовков MSFT, я изменяю чистым образом файлы заголовков, поставляемые Microsoft. Существует не так много изменений для реализации.

Если компилятор жалуется на предупреждение C4305, в исходном файле я вставляю:

#pragma warning( disable : 4305)

до строки нарушения, за которой следуют:

#pragma warning( default : 4305)

после строки нарушения. Никакого побочного эффекта. Возможно, Microsoft сделала это, возможно.