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

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

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

Вот несколько примеров для чтения:

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/

Ответы [ 6 ]

39 голосов
/ 23 октября 2010

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

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

27 голосов
/ 18 мая 2013

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

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

Этот ответ был украден из другого потока переполнения стека: (/1785143/kak-podavit-preduprezhdeniya-vo-vneshnih-zagolovkah-v-visual-c).

Я полностью согласен с комментариями "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 с дополнительным), для защиты от внешних заголовков описанным выше способом, затем компилировать с / Wall. Это часть работы, но она того стоит. При GCC это просто вопрос использования -isystem. Разработка Microsoft: обратите внимание! VS - умный продукт, но иногда он просто тупой из-за простых вещей.

9 голосов
/ 26 сентября 2013

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

  1. Для проекта установите уровень предупреждения / Wall (максимальное количество предупреждений)
  2. Для файла stdafx.cpp установитеуровень предупреждений для / W4 (много предупреждений включено, но заголовки MS проходят без вывода сообщений)
  3. Для проекта в разделе «Отключить определенные предупреждения» добавьте 4652

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

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

6 голосов
/ 23 октября 2010

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

2 голосов
/ 27 августа 2013

в MSVC 2010

Опция

Свойства конфигурации

C / C ++

Advanced

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

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

1 голос
/ 27 августа 2013

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

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

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

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

#pragma warning( disable : 4305)

перед ошибочной строкой, а затем:

#pragma warning( default : 4305)

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

...