Из опыта с очень похожими проблемами (но со встроенными Windows 'системными' заголовками, а не сторонними материалами) я неохотно принял тот факт, что система #pragma warning (push|pop)
на самом деле не работает! Это кажется особенно true, когда установлена опция «Включить все предупреждения» (/Wall
), так как #pragma warning(pop)
не понимает, какой «номер уровня» восстановить.
только выполнимый метод, который я (до сих пор) придумал, состоит в том, чтобы явно отключить соответствующие предупреждения перед включением сторонних заголовков, затем (опять же, явно) ) сбросьте их потом. Вот краткая выдержка из «глобального» заголовка (тот, который я использую для генерации предварительно скомпилированного заголовка), который я использую для построения своих проектов:
// Turn off warnings generated by the "standard" and "MFC" header files. *** Note: using "#pragma(push, 2) ...
// #pragma(pop)" to embrace these header files doesn't work! *** [For some reason (possibly something weird in
// one of the headers), warnings such as 'unused parameters' and 'signed/unsigned' are not re-enabled.] ...
#pragma warning(disable:4091) // 'typedef' ignored on left of tagGPFIDL.
#pragma warning(disable:4191) // unsafe conversion to AFX_PMSG(W) (MMAP)
#pragma warning(disable:4239) // Non-standard: conv. <class> to &<class>
#pragma warning(disable:4251) // class 'XXX' needs to have dll-interface
#pragma warning(disable:4263) // member function does not override . ...
//... and around 30 or so other, similar lines.
#include <afxwin.h> // Minimal set of afx... (MFC) headers for the things we want to do ... (?)
#include <afxwinappex.h> // Required for the base application class: MFC's CWinAppEx
#include <afxmdiframewndex.h> // Base frame windows "CMDIFrameWndEx" and "CMDIChildWndEx"
#include <mmsystem.h> // Mulitmedia APIs: allows playing of sounds in various alert message boxes
#include <MsiQuery.h> // Required for DLL interface to the MSI installer (itself #includes msi.h)
//... and all other warning-prone headers ...
#pragma warning(default:4091) // 'typedef' ignored on left of tagGPFIDL.
#pragma warning(default:4191) // unsafe conversion to AFX_PMSG(W) (MMAP)
#pragma warning(default:4239) // Non-standard: conv. <class> to &<class>
#pragma warning(default:4251) // class 'XXX' needs to have dll-interface
#pragma warning(default:4263) // member function does not override . ...
//... and all the others corresponding to those that were disabled
Обратите внимание, что с помощью #pragma warning(default:nnnn)
( вместо #pragma warning(enable:nnnn)
) вы сбрасываете предупреждение в настройку проекта , а не вслепую , включающее это.
Я понимаю, что это довольно неуклюже - и, почти наверняка, не то, что вы ищете или - но это работает работает. Кроме того, после того, как вы создали базовый список предупреждений c, это решение относительно не требует обслуживания.
PS: Насколько мне известно, для MSVC
нет никаких опций. процессор может обнаружить или изменить параметр компилятора /WX
(обрабатывать предупреждения как ошибки), хотя вы можете установить его для любого специфицированного c предупреждения с помощью #pragma warning(error:nnnn)
и «сбросить» его с помощью default
.
РЕДАКТИРОВАТЬ: Другой возможный способ отключить следующее:
предупреждение C4505: 'bar': удалена локальная функция без ссылки
на самом деле ссылается на функцию-нарушитель. Но я здесь не сарказти c - вы можете включить фиктивную stati c inline функцию, которая ссылается на bar
(в вашем заголовке) и которая отключит предупреждение (это не так) дано для функций, определенных как static inline
). Итак, предположим, что функция bar
определена (в стороннем заголовке) следующим образом:
static int bar(int b)
{
return b * b;
}
, но bar
никогда не упоминается в (некоторых) ваших единицах сборки, затем добавьте эту строку в ваш «глобальный» заголовок (после включения стороннего заголовка) будет убито предупреждение (для MSVC
, но не для clang-cl
):
static inline int foo(int a) { return bar(a); }
Конечно, если есть много таких предупреждений, этот метод может стать немного громоздким; но опять же, как только вы написали код, он требует минимального обслуживания.