gcc警告“'将在'之后初始化'

时间:2009-10-14 08:11:29

标签: g++ suppress-warnings

我从第三方代码中收到很多我无法修改的警告。 有没有办法禁用此警告或至少禁用某些区域(如VC ++中的#pragma push / pop)?

示例:

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

7 个答案:

答案 0 :(得分:326)

确保成员按照它们在类

中出现的顺序出现在初始化列表中
Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

或者您可以转为-Wno-reorder

答案 1 :(得分:28)

您可以使用-Wno-reorder停用它。

答案 2 :(得分:15)

对于那些使用QT有此错误的人,请将其添加到.pro文件

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

答案 3 :(得分:7)

使用-Wno-reorder(男人gcc是你的朋友:))

答案 4 :(得分:4)

如果您看到库标题出现错误并且您正在使用GCC,那么您可以通过使用-isystem代替-I来添加标题来停用警告。

clang中存在类似的功能。

如果您使用的是CMake,则可以为include_directories指定SYSTEM

答案 5 :(得分:1)

初始化顺序无关紧要。所有字段都按其类/结构中的定义顺序进行初始化。但是如果初始化列表中的顺序不同,gcc / g ++会生成此警告。仅更改初始化顺序以避免此警告。但是在构造之前,您无法在初始化中定义字段。这将是一个运行时错误。所以你改变了定义的顺序。小心并保持注意!

答案 6 :(得分:0)

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

顺序很重要,因为如果a在b之前初始化,并且a取决于b。出现未定义的行为。