2014-10-05 4 views
8

Sto imparando C++ e sto provando a scrivere un buon codice. Attualmente sto usando un lof di flag di compilazione, come ad esempioQuale flag dovrei usare per imporre un buon stile C++ 11?

-Wextra -Wall -pedantic -Werror -Wfatal-errors -Wcast-qual -Wcast-align -Wconversion -Wdouble-promotion -Wfloat-equal -Wshadow -Wpointer-arith -Weffc++ -ansi -Wstrict-aliasing

ho appena appreso che le parole chiave new e delete non deve essere utilizzato più in C++ 11. Tuttavia, non ho alcun avviso quando li uso.

Esistono alcuni flag da utilizzare per garantire un buon stile C++ 11?

+11

* Ho appena appreso che le parole chiave new e delete non dovrebbero più essere utilizzate in C++ 11. * Dove l'hai letto? Sei sicuro di aver capito bene? Sei scoraggiato nell'usare puntatori grezzi in cui dovrai preoccuparti di liberare una risorsa in seguito. Non puoi davvero evitare di usare 'new' e' delete' e non c'è motivo di farlo. Si può nascondere usando 'new' dietro una chiamata come' std :: make_unique() 'o' std :: make_shared() ', ma dietro le quinte quelle sono chiamate appena spostate a' new'. – Mario

+7

@Mario: il C++ moderno non ha davvero bisogno di usare 'delete' spesso, molte applicazioni potrebbero essere meglio servite senza mai chiamarlo direttamente (e raramente chiamando' new'). Hai ragione a dubitare che il problema dell'OP sia puro dogma, ma in questo momento "cancella" nel codice dell'applicazione è una bandiera rossa. Tuttavia, con un numero così elevato di codici di libreria nelle intestazioni nel moderno C++, c'è anche il fatto che 'delete' può apparire al compilatore anche se l'utente non lo ha scritto. Questa è la cosa complicata degli avvertimenti: la maggior parte dei compilatori non discrimina tra il "tuo" codice e il "loro" codice. –

+0

@ Mario il punto è che * tu * non dovresti mai usarli, alcune librerie sì. – o11c

risposta

5

In primo luogo, devi capire che il tuo compilatore non imporrà mai del buon stile.

Tuttavia, ci sono due tecniche che è possibile utilizzare per il compilatore a aiuto a far valere il proprio stile: le avvertenze (che possono essere passati sulla riga di comando o in pragma) e pragma veleno.

È difficile, tuttavia, gestire l'insieme esatto di avvisi disponibili con ogni versione del compilatore, quindi ho creato a list of warnings. Nota che il supporto per clang è minimo, i suoi avvertimenti sono solitamente inferiori a gcc in practive, nonostante il loro fantastico marketing; Inoltre, è impossibile rilevare quale versione di clang si sta utilizzando per aggirare i bug (le macro di rilevamento delle funzionalità sono piuttosto inutili).

Ho fatto anche a list of poison.

Inoltre, ho alcune magie makefile che assicurano che le suddette due tecniche siano applicate a tutti i file applicabili oltre a fare altri controlli.

Va notato, tuttavia, che ogni applicazione ha esigenze diverse, quindi queste intestazioni non devono essere utilizzate così come sono. Pochissime applicazioni, ad esempio, vorrebbero avvelenare lo std::string come ho fatto io.

+0

Grazie, non conoscevo il pragma, fa quello che volevo! –

+0

L'avvelenamento di dynamic_cast ha poco senso in IMHO, usa invece -fno-rtti. – Nils

+0

@Nils rtti è utile per più di 'dynamic_cast'. – o11c