advertencia de gcc "'se inicializará después de'

228

Recibo muchas de estas advertencias del código de terceros que no puedo modificar. ¿Hay alguna forma de deshabilitar esta advertencia o al menos deshabilitarla para ciertas áreas (como #pragma push / pop en VC ++)?

Ejemplo:

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_'
LK__
fuente
¿Puedes publicar un par de líneas de las advertencias reales? ¿Y también decir si esto es C, C ++ y si tiene la fuente, si la advertencia proviene del enlazador o el proceso de compilación?
csl

Respuestas:

371

Asegúrese de que los miembros aparezcan en la lista de inicializadores en el mismo orden en que aparecen en la clase

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

o puedes girar -Wno-reorder

uray
fuente
91
¿Por qué es esto importante por cierto? ¿Por qué existe esta advertencia?
Eloff
40
@Eloff En algunos casos (no recomendable), by la ainicialización podrían depender unos de otros. Un usuario ingenuo podría intentar alterar el orden de inicialización para obtener algún efecto y la Advertencia dejaría en claro que no funciona.
Gorpik
24
Entonces, ¿el orden de las declaraciones tiene un significado semántico, incluso si no hay una relación entre las declaraciones? ¡Qué inútil!
Cuadue
10
Esto no explica por qué existe esta advertencia y cita -Wno-reordersin mencionar a qué problemas podría conducir. Soy consciente de que el OP no solicitó ningún otro detalle, pero una respuesta tan altamente votada esperaría al menos mencionar el contexto y las advertencias al respecto. ¿No se supone que debemos responder la pregunta que el OP debería haber escrito?
underscore_d
44
Los miembros de @ cp.engr se inicializan en el orden de su declaración, no su orden en la lista de inicio, por lo tanto, si la inicialización de un miembro depende de otra, pero las declaraciones se intercambian para que el dependiente se inicialice después de su dependiente, alguien Lo pasará muy mal muy pronto, ya que es puro UB.
underscore_d
30

Puedes deshabilitarlo con -Wno-reorder.

Lukáš Lalinský
fuente
17

Para aquellos que usan QT que tienen este error, agregue esto al archivo .pro

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder
usuario1175197
fuente
7

uso -Wno-reorder(man gcc es tu amigo :))

LaszloG
fuente
66
Wow, encontraste una nueva forma de decir RT_M: MIYF (el hombre es tu amigo) Si no te importa, lo voy a usar :)
Oren S
4

Si ve errores en los encabezados de la biblioteca y está usando GCC, puede deshabilitar las advertencias al incluir los encabezados usando en -isystemlugar de -I.

Características similares existen en clang .

Si está utilizando CMake, puede especificar SYSTEMpara include_directories.

Drew Noakes
fuente
¿Puedes explicar cómo "especificar SYSTEM"?
einpoklum
1
Simplemente ponga la cadena `SYSTEM 'al final de la include_directorieslínea.
Drew Noakes
1

El orden de inicialización no importa. Todos los campos se inicializan en el orden de su definición en su clase / estructura. Pero si el orden en la lista de inicialización es diferente, gcc / g ++ genera esta advertencia. Solo cambie el orden de inicialización para evitar esta advertencia. Pero no puede definir el campo utilizando en la inicialización antes de su construcción. Será un error de tiempo de ejecución. Entonces cambias el orden de definición. ¡Ten cuidado y mantén la atención!

Anatoly
fuente
El OP quería saber cómo deshabilitar la advertencia, no lo que significa o cómo solucionar el código. De hecho, la publicación dice que el código es de terceros y no se puede modificar. No pueden cambiar el orden de definición y probablemente tampoco el orden de inicialización.
Tim Seguine
mucho hace importa si el segundo objeto en la lista de inicio se initd del primero objeto, pero están declaró al revés en la cabecera. en ese caso, las cosas podrían ponerse muy raras.
underscore_d
0
Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

el orden es importante porque si a se inicializa antes que b, y a depende de b. aparecerá un comportamiento indefinido.

Samuel
fuente