2010-03-29 16 views
41

Sto avviando un nuovo progetto BREW e mi piacerebbe compilare con il livello di avviso 4 (/ W4) per mantenere il codice dell'applicazione bello e pulito. Il problema è che le intestazioni BREW stesse non si compilano in modo pulito con/W4.Come sopprimere gli avvisi nelle intestazioni esterne in Visual C++

In gcc è possibile distinguere tra le intestazioni di applicazione e di sistema utilizzando -I e -isystem, e quindi, per impostazione predefinita gcc non riporta alcun avviso di compilazione nelle intestazioni di sistema. Esiste un meccanismo equivalente in Visual C++?

+0

voto per https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/14717934-add-a-cl-exe-option-for-system-headers-like-gcc-s – Trass3r

risposta

65

Utilizzare questo metodo solo attorno a un blocco di intestazioni che non è possibile modificare, ma che è necessario includere.

È possibile selettivamente, e disattivare temporaneamente tutti gli avvertimenti come questo:

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

Invece di 0 si può opzionalmente passare del numero di allarme per disabilitare, quindi qualcosa di simile:

#pragma warning(push) 
#pragma warning(disable : 4081) 
#pragma warning(disable : 4706) 
// Some code 
#pragma warning(pop) 
+1

StackOverflow rocks. Grazie per la risposta completa. Questa soluzione è relativamente fastidiosa perché deve essere eseguita correttamente in ogni file sorgente, mentre in gcc basta configurare il makefile correttamente una volta. –

+2

@Bob: No prob, felice di aiutare. Potresti provare a inserire quelli inclusi in un file diverso e mettere l'avviso di inclusione disabilita solo quel file. –

+0

Non è particolarmente pratico anche per BREW, perché non esiste un singolo file di intestazione di base (o un piccolo gruppo di file di intestazione) da includere con un'intestazione intermedia. Un progetto tipico avrà molti file di origine e di intestazione, ognuno dei quali include un sottoinsieme diverso delle intestazioni BREW. Potrei potenzialmente creare una super-intestazione che includa TUTTE le intestazioni BREW e quindi pre-compilare per mantenere efficienti le build. Questa tecnica funziona solo con Visual C++ e i progetti BREW devono essere compilati con almeno due compilatori (Visual C++ per build simulator e gcc o ARM per cellulari). –

4

I don Credo che Visual C++ ti consenta di differenziare. Si può fingere utilizzando #pragma warning intorno al comprendono: squadra

#pragma warning(push, 0) 
#include "mywarningheader.h" 
#pragma warning(pop) 
+1

Differenziare cosa? – einpoklum

+2

@einpoklum Distingue tra le intestazioni specifiche dell'applicazione e altre intestazioni (di terze parti, di sistema, ecc.) Che non è possibile modificare. – Dienes

1

Visual C++ ha appena aggiunto il supporto per i livelli di allarme nelle intestazioni esterni. Puoi trovare i dettagli nel loro post sul blog: Broken Warnings Theory.

In sostanza fa automaticamente ciò che i suggerimenti qui consigliavano di fare manualmente: spinge il nuovo livello di avviso subito prima della direttiva #include e lo apre subito dopo. Sono presenti flag aggiuntivi per specificare le posizioni delle intestazioni esterne, flag per il trattamento di tutti gli <> include come external, #pragma system_header e una funzione non disponibile in Clang o GCC (al momento della stesura) per visualizzare gli avvertimenti negli header esterni attraverso lo stack di istanziazione dei template quando il modello è stato istanziato nel codice utente.

Oltre ai commenti sotto quel post, è anche possibile trovare alcune discussioni utili in a reddit announcement for that post.

Problemi correlati