aviso gcc "'será inicializado após'

228

Estou recebendo muitos desses avisos do código de terceiros que não posso modificar. Existe uma maneira de desabilitar esse aviso ou, pelo menos, desabilitá-lo para determinadas áreas (como #pragma push / pop no VC ++)?

Exemplo:

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__
fonte
Você pode postar algumas linhas dos avisos reais? E também diga se é C, C ++ e se você possui a fonte, se o aviso vier do processo de vinculação ou compilação?
CSL

Respostas:

371

Verifique se os membros aparecem na lista de inicializadores na mesma ordem em que aparecem na classe

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

ou você pode ligar -Wno-reorder

uray
fonte
91
Por que isso é importante? Por que esse aviso existe?
Eloff
40
@Eloff Em alguns casos (não recomendável), be ainicialização pode depender um do outro. Um usuário ingênuo pode tentar alterar a ordem de inicialização para obter algum efeito e o Aviso deixaria claro que não funciona.
Gorpik
24
Portanto, a ordem das declarações tem significado semântico, mesmo que não exista relação entre as declarações? Que inútil!
Cuadue 26/08/14
10
Isso não explica por que esse aviso existe e cita -Wno-reordersem mencionar os problemas que poderiam levar a. Estou ciente de que o OP não pediu outros detalhes, mas uma resposta tão votada que eu esperaria mencionar pelo menos o contexto e as advertências em torno disso. Não devemos responder à pergunta que o OP deveria ter escrito?
underscore_d
4
Os membros do @ cp.engr são inicializados na ordem da declaração, não na ordem init-list - portanto, se a inicialização de um membro depende de outro, mas as declarações são trocadas para que o dependente seja inicializado após o dependente, alguém muito em breve, pois isso é puro UB.
Underscore_d
30

Você pode desativá-lo com -Wno-reorder.

Lukáš Lalinský
fonte
17

Para aqueles que usam o QT com esse erro, adicione-o ao arquivo .pro

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder
user1175197
fonte
7

use -Wno-reorder(man gcc é seu amigo :))

LaszloG
fonte
6
Uau, você encontrou uma nova maneira de dizer RT_M: MIYF (o homem é seu amigo) Se você não se importa, eu vou usá-lo :)
Oren S
4

Se você estiver vendo erros nos cabeçalhos da biblioteca e estiver usando o GCC, poderá desativar os avisos incluindo os cabeçalhos usando em -isystemvez de -I.

Recursos semelhantes existem no clang .

Se você estiver usando o CMake, poderá especificar SYSTEMpara include_directories.

Drew Noakes
fonte
Você pode explicar como "especificar SYSTEM"?
einpoklum
1
Basta colocar a string `SYSTEM` no final da include_directorieslinha.
Drew Noakes
1

A ordem de inicialização não importa. Todos os campos são inicializados na ordem de sua definição em sua classe / estrutura. Mas se a ordem na lista de inicialização for diferente, gcc / g ++ gere esse aviso. Altere apenas a ordem de inicialização para evitar esse aviso. Mas você não pode definir o campo usando na inicialização antes de sua construção. Será um erro de tempo de execução. Então você altera a ordem da definição. Tenha cuidado e mantenha a atenção!

Anatoly
fonte
O OP queria saber como desativar o aviso, não o que significa ou como corrigir o código. De fato, a publicação diz que o código é de terceiros e não pode ser modificado. Eles não podem alterar a ordem da definição e provavelmente também não a ordem da inicialização.
Tim Seguine
muito dele faz importa se o 2º objeto na lista de init é initd do 1º objeto, mas eles estão declarado o caminho errado ao redor no cabeçalho. nesse caso, as coisas podem ficar muito estranhas.
underscore_d
0
Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

a ordem é importante porque se a é inicializado antes de be dependem de b. comportamento indefinido será exibido.

Samuel
fonte