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

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


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


17

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

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

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


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.


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!


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.