gcc warning "'verrà inizializzato dopo'


228

Ricevo molti di questi avvisi da codice di terze parti che non posso modificare. C'è un modo per disabilitare questo avviso o almeno disabilitarlo per determinate aree (come #pragma push / pop in VC ++)?

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_'

Potete per favore pubblicare un paio di righe degli avvisi reali? E dire anche se si tratta di C, C ++ e se si ha l'origine, se l'avviso proviene dal linker o dal processo di compilazione?
CSL

Risposte:


371

Assicurarsi che i membri vengano visualizzati nell'elenco degli inizializzatori nello stesso ordine in cui compaiono nella classe

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

oppure puoi girare -Wno-reorder


91
Perché questo è importante btw? Perché esiste questo avviso?
Eloff,

40
@Eloff In alcuni casi (non consigliabile), be al'inizializzazione potrebbero dipendono l'uno dall'altro. Un utente ingenuo potrebbe provare a modificare l'ordine di inizializzazione per ottenere qualche effetto e l'avvertimento chiarirebbe che non funziona.
Gorpik,

24
Quindi l'ordine delle dichiarazioni ha un significato semantico, anche se non esiste alcuna relazione tra le dichiarazioni? Che inutile!
Cuadue,

10
Questo non spiega perché esiste questo avvertimento e cita -Wno-reordersenza menzionare quali problemi potrebbero portare. Sono consapevole che l'OP non ha richiesto altri dettagli, ma una risposta così votata mi aspetterei almeno di menzionare il contesto e le avvertenze intorno a questo. Non dovremmo rispondere alla domanda che l'OP avrebbe dovuto scrivere?
underscore_d

4
I membri di @ cp.engr vengono inizializzati nell'ordine della loro dichiarazione, non nel loro ordine nella lista di inizializzazione - quindi, se l'inizializzazione di un membro dipende da un'altra, ma le dichiarazioni vengono scambiate in modo che l'iniziale venga inizializzato dopo la sua dipendenza, qualcuno molto presto passerà un brutto momento, dato che è puro UB.
underscore_d


17

Per coloro che utilizzano QT con questo errore, aggiungilo al file .pro

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

usa -Wno-reorder(man gcc è tuo amico :))


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

4

Se visualizzi errori dalle intestazioni delle librerie e stai utilizzando GCC, puoi disabilitare gli avvisi includendo le intestazioni utilizzando -isystemanziché -I.

Funzionalità simili esistono in clang .

Se stai usando CMake, puoi specificare SYSTEMper include_directories.


Puoi spiegare come "specificare SYSTEM"?
einpoklum,

1
Metti semplicemente la stringa `SYSTEM` alla fine della include_directoriesriga.
Drew Noakes,

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 nell'elenco di inizializzazione è diverso, gcc / g ++ genera questo avviso. Modificare l'ordine di inizializzazione solo per evitare questo avviso. Ma non puoi definire il campo usando nell'inizializzazione prima del suo costrutto. Sarà un errore di runtime. Quindi cambiate l'ordine di definizione. Stai attento e mantieni l'attenzione!


L'OP voleva sapere come disabilitare l'avviso, non cosa significa o come riparare 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.
Tim Seguine,

moltissimo non importa se il 2 ° oggetto nell'elenco init è initd dall'oggetto prima, ma sono dichiarati nel modo sbagliato intorno nell'intestazione. in tal caso, le cose potrebbero diventare molto strane.
underscore_d

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

l'ordine è importante perché se a è inizializzato prima di b e a dipende da b. apparirà un comportamento indefinito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.