Domanda

Sto lavorando a un grande progetto di collaborazione in C ++ che è sia sviluppato che eseguito su varie versioni di Linux, OS X e Windows. Compiliamo su queste piattaforme con GCC, Visual Studio C ++ e il compilatore Intel C ++. Mentre sempre più persone iniziano a sviluppare codice per il progetto, stiamo iniziando a vedere strani errori nella compilazione e nel runtime che sono specifici di compilatori specifici su determinati sistemi operativi. Un esempio è l'inclusione implicita delle intestazioni che alcune coppie di sistemi operativi / compilatori sembrano trovare per te, sovraccaricando accidentalmente una funzione di una classe base in una classe derivata.

Il mio obiettivo è rendere la compilazione su GCC più rigorosa e rilevare più errori su tutte le piattaforme in modo da non incorrere in questi problemi. Ecco il mio elenco di flag che sto pensando di provare per GCC che ho trovato tramite Google e le pagine man di GCC:

  • -Wall
  • -Wextra
  • -Winit-auto
  • -Wold-style-fusione
  • -Woverloaded-virtual
  • -Wuninitialized
  • -Wmissing-dichiarazioni
  • -Winit-auto
  • -ansi
  • -pedantic

Quali sono gli altri flag che le persone usano per far sì che GCC (e, soprattutto, Visual Studio C ++ e il compilatore Intel C ++) obbediscano a uno standard più rigoroso del linguaggio C ++? Sii specifico su quale compilatore e versione stai parlando, poiché alcuni di questi potrebbero non essere implementati in tutte le versioni di tutti i compilatori.

È stato utile?

Soluzione

Oltre all'errore pedante che tutti gli altri hanno suggerito, IMO, è sempre bene eseguire lint come parte del processo di compilazione.

Ci sono alcuni strumenti là fuori:

Risparmieranno molto tempo.

Altri suggerimenti

È possibile effettuare avvisi pedanti in errori con -pedantic-errors. Ciò impedirà agli sviluppatori di ignorarlo. In ogni caso, potresti fare tutti gli avvisi in errori anche con -Werror sebbene ciò possa essere controproducente in alcuni casi (forse non nel tuo però).

Nel complesso, credo, per quanto riguarda l'adesione a uno standard rigoroso, le -pedantic opzioni sono le più utili.

-pedantic-errori.

Scopri di più su gcc (1) .

Copia e incolla sotto la riga nel tuo file master cmake. la riga sottostante comprende i flag del compilatore quasi più utili al fine di testarti più rigorosamente.

set(CMAKE_CXX_FLAGS "-O0 -fno-elide-constructors -pedantic-errors -ansi -Wextra -Wall     -Winit-self -Wold-style-cast -Woverloaded-virtual -Wuninitialized -Wmissing-declarations    -Winit-self -std=c++98")

Se non usi cmake, copia le bandiere tra virgolette doppie e le invii al tuo compilatore

Oltre a -pendantic dovresti anche fornire un -std interruttore. Se hai bisogno di una compilazione più rigorosa, dovresti sapere a quale standard stai cercando di conformarti. In genere per l'attuale c ++ sarebbe -std=c++98. (-ansi svolge una funzione simile in modalità C ++, ma -std= è più esplicito.)

In una situazione simile ci siamo arresi e siamo passati a ACE framework , nascondendo la differenza tra le piattaforme.

Ho scritto il post sul blog su questo argomento dopo aver ricercato diverse opzioni. È inoltre necessario gestire i casi in cui si utilizzano altre librerie ma non seguono una compilazione rigorosa. Fortunatamente esiste anche un modo semplice per gestirli. Ho usato questo ampiamente in tutti i miei progetti.

In breve, utilizzare le seguenti opzioni del compilatore per attivare la modalità molto rigida (di seguito è quello che ho messo in CMakeLists.txt):

set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wextra  -Wstrict-aliasing -pedantic -fmax-errors=5 -Werror -Wunreachable-code -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses -fdiagnostics-show-option ${CMAKE_CXX_FLAGS}")

Puoi leggere di più su come attivare e disattivare questa modalità rigorosa per specifiche parti di codice qui: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top