2009-10-14 16 views
173

Ricevo molti di questi avvisi dal codice di terze parti che non posso modificare C'è un modo per disabilitare questo avviso o almeno disabilitarlo per certe aree (come #pragma push/pop in VC++)Avviso gcc "'verrà inizializzato dopo'

Esempio:?.

list.h:1122: warning: `list<LogOutput*, allocator<LogOutput*> >::node_alloc_' will be initialized after 
list.h:1117: warning: `allocator<LogOutput*> list<LogOutput*, allocator<LogOutput*> >::alloc_' 
+0

Potete per favore pubblicare un paio di righe degli avvertimenti attuali? E anche dire se questo è C, C++, e se si ha la fonte, se l'avviso proviene dal linker o dal processo di compilazione? – csl

risposta

277

Assicurarsi che i membri compaiono nella lista di inizializzazione nello stesso ordine in cui appaiono nella classe

Class C { 
    int a; 
    int b; 
    C():b(1),a(2){} //warning, should be C():a(2),b(1) 
} 

o si può trasformare -Wno-reorder

+10

OP non può modificare il codice. –

+64

Perché è importante questo? Perché questo avviso esiste? – Eloff

+30

@Eloff In alcuni casi (sconsigliabile), l'inizializzazione 'b' e' a' possono dipendere l'una dall'altra. Un utente ingenuo potrebbe provare a modificare l'ordine di inizializzazione per ottenere un certo effetto e l'avvertenza dovrebbe chiarire che non funziona. – Gorpik

28

è possibile disattivarla con -Wno-reorder

7

uso -Wno-reorder (uomo gcc è tuo amico :))

+5

Wow, hai trovato un nuovo modo di dire RT_M: MIYF (l'uomo è tuo amico) Se non ti dispiace, lo userò :) –

12

Per coloro che utilizzano QT avere questo errore, aggiungere questo a. pro file

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder 
1

L'ordine di inizializzazione non ha importanza. Tutti i campi sono inizializzati nell'ordine della loro definizione nella loro classe/struttura. Ma se l'ordine nella lista di inizializzazione è diverso gcc/g ++ genera questo avviso. Cambiare solo l'ordine di inizializzazione per evitare questo avvertimento. Ma non è possibile definire il campo usando in fase di inizializzazione prima del suo costrutto. Sarà un errore di runtime. Quindi cambi l'ordine di definizione. Stai attento e attenti!

+0

L'OP voleva sapere come disabilitare l'avviso, non cosa significa o come correggere il codice. In effetti, il post dice che il codice è di terze parti e non può essere modificato. Non possono cambiare l'ordine di definizione e probabilmente nemmeno l'ordine di inizializzazione. –

+0

molto ** importa ** se il secondo oggetto nella lista di init è initd dal primo oggetto, ma sono dichiarati nella direzione sbagliata. in quel caso, le cose potrebbero diventare molto strane. –

4

Se visualizzi errori dalle intestazioni di libreria e stai utilizzando GCC, puoi disattivare gli avvisi includendo le intestazioni utilizzando -isystem anziché -I.

Caratteristiche simili sono disponibili in clang.

Se si utilizza CMake, è possibile specificare SYSTEM per include_directories.

+0

Puoi spiegare come "specificare' SYSTEM' "? – einpoklum

+1

Basta mettere la stringa 'SYSTEM' alla fine della riga' include_directories'. –

Problemi correlati