Gcc warning "" будет инициализирован после '

Я получаю много этих предупреждений от стороннего кода, который я не могу изменить. Есть ли способ отключить это предупреждение или, по крайней мере, отключить его для определенных областей (например, #pragma push/pop в VС++)?

Пример:

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

Ответ 1

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

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

или вы можете включить -Wno-reorder

Ответ 2

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

Ответ 3

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

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

Ответ 4

используйте -Wno-reorder (человек gcc - ваш друг:))

Ответ 5

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

Подобные функции существуют в clang.

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

Ответ 6

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

Ответ 7

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

порядок важен, потому что если a инициализируется до b, а a зависит от b. Появится неопределенное поведение.