Как отключить предупреждение, которое снова включается в сторонний код? - PullRequest
1 голос
/ 10 февраля 2020

Мое требование к проекту - вообще не иметь предупреждений, рассматривая их как ошибки, но сторонние инструменты генерируют свои собственные предупреждения, чей код я не могу открыть.

Поэтому я должен отключить определенные c предупреждения перед включая сторонние заголовки:

#pragma warning( push )
#pragma warning( disable : 4005 ) // macro redefinition
#pragma warning( disable : 4505 ) // unreferenced local function has been removed
#include <cuda_runtime_api.h>
#pragma warning( pop )

Этот подход иногда работает, иногда нет, в зависимости от файла заголовка.

Может ли это быть из-за того, что учитываются все предупреждения в качестве ошибок предупреждение #pragma не применяется?

Или, может быть, во включенном коде есть #pragmas, которые отключают мои?

Как я могу их подавить?

PS: Программа построена с флагом / WX (обрабатывать предупреждения как ошибки) Visual Studio. Как я могу отключить его в некоторых частях исходного кода, особенно для стороннего кода, который я включаю, с препроцессором?

1 Ответ

2 голосов
/ 10 февраля 2020

Из опыта с очень похожими проблемами (но со встроенными 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); }

Конечно, если есть много таких предупреждений, этот метод может стать немного громоздким; но опять же, как только вы написали код, он требует минимального обслуживания.

...