Ответ 1
Убедитесь, что члены отображаются в списке инициализаторов в том же порядке, что и в классе
Class C {
int a;
int b;
C():b(1),a(2){} //warning, should be C():a(2),b(1)
}
или вы можете включить -Wno-reorder
Я получаю много этих предупреждений от стороннего кода, который я не могу изменить. Есть ли способ отключить это предупреждение или, по крайней мере, отключить его для определенных областей (например, #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_'
Убедитесь, что члены отображаются в списке инициализаторов в том же порядке, что и в классе
Class C {
int a;
int b;
C():b(1),a(2){} //warning, should be C():a(2),b(1)
}
или вы можете включить -Wno-reorder
Вы можете отключить его с помощью -Wno-reorder
.
Для тех, кто использует QT с этой ошибкой, добавьте это в .pro файл
QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder
используйте -Wno-reorder
(человек gcc - ваш друг:))
Если вы видите ошибки в заголовках библиотек и используете GCC, вы можете отключить предупреждения, включив заголовки, используя -isystem
вместо -I
.
Подобные функции существуют в clang.
Если вы используете CMake, вы можете указать SYSTEM
для include_directories
.
Порядок инициализации не имеет значения. Все поля инициализируются в порядке их определения в их классе/структуре. Но если порядок в списке инициализации отличается от gcc/g++, генерируйте это предупреждение. Измените порядок инициализации, чтобы избежать этого предупреждения. Но вы не можете определить использование поля при инициализации перед его конструкцией. Это будет ошибка времени выполнения. Таким образом, вы меняете порядок определения. Будьте осторожны и держите внимание!
Class C {
int a;
int b;
C():b(1),a(2){} //warning, should be C():a(2),b(1)
}
порядок важен, потому что если a инициализируется до b, а a зависит от b. Появится неопределенное поведение.