2009-10-14 4 views
173

Я получаю много этих предупреждений от стороннего кода, который я не могу изменить. Есть ли способ отключить это предупреждение или, по крайней мере, отключить его для определенных областей (например, #pragma тяни/поп в VC++)gcc warning "'будет инициализирован после'

Пример:.

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

Можете ли вы отправить пару строк фактических предупреждений? А также сообщите, если это C, C++, и если у вас есть источник, если предупреждение возникает из компоновщика или процесса компиляции? – csl

ответ

277

Убедитесь, что элементы отображаются в списке инициализации в том же порядке, как они появляются в классе

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

или вы можете превратить -Wno-reorder

+10

OP не может изменить код. –

+64

Почему это важно? Почему это предупреждение существует? – Eloff

+30

@Eloff В некоторых случаях (не рекомендуется) инициализация 'b' и' a' может зависеть друг от друга. Наивный пользователь может попытаться изменить порядок инициализации, чтобы получить некоторый эффект, и Предупреждение даст понять, что оно не работает. – Gorpik

28

Вы можете отключить его с -Wno-reorder

7

использование -Wno-reorder (мужчина НКУ является вашим другом :))

+5

Ничего себе, вы нашли новый способ сказать RT_M: MIYF (мужчина - ваш друг) Если вы не против, я собираюсь использовать его :) –

12

Для тех, кто использует QT имея эту ошибку, добавьте в. pro file

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder 
1

Порядок инициализации не имеет значения. Все поля инициализируются в порядке их определения в их классе/структуре. Но если порядок в списке инициализации отличается от gcc/g ++, генерируйте это предупреждение. Измените порядок инициализации, чтобы избежать этого предупреждения. Но вы не можете определить использование поля при инициализации перед его конструкцией. Это будет ошибка времени выполнения. Таким образом, вы меняете порядок определения. Будьте осторожны и держите внимание!

+0

OP хотел знать, как отключить предупреждение, а не то, что это значит, или как исправить код. Фактически, сообщение говорит, что код является третьим лицом и не может быть изменен. Они не могут изменить порядок определения и, возможно, не порядок инициализации. –

+0

это очень ** ** имеет значение, если 2-й объект в списке инициализации является initd из 1-го объекта, но они объявлены неправильным способом в заголовке. в этом случае все может стать очень странным. –

4

Если вы видите ошибки в заголовках библиотек и используете GCC, вы можете отключить предупреждения, включив заголовки, используя -isystem вместо -I.

подобные особенности есть в clang.

Если вы используете CMake, вы можете указать SYSTEM для include_directories.

+0

Можете ли вы объяснить, как «указать« СИСТЕМА »? – einpoklum

+1

Просто поместите строку 'SYSTEM' в конец строки' include_directories'. –