256

我从无法修改的第 3 方代码中收到很多警告。有没有办法禁用此警告或至少在某些区域禁用它(例如 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_'
4

7 回答 7

439

确保成员出现在初始化列表中的顺序与它们在类中出现的顺序相同

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

或者你可以转-Wno-reorder

于 2010-12-17T04:28:08.937 回答
30

您可以使用 禁用它-Wno-reorder

于 2009-10-14T08:23:07.483 回答
18

对于那些使用 QT 时出现此错误的用户,请将其添加到 .pro 文件中

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder
于 2013-01-28T16:12:43.090 回答
7

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

于 2009-10-14T08:23:16.327 回答
5

如果您从库标头中看到错误并且您正在使用 GCC,那么您可以通过使用-isystem而不是包含标头来禁用警告-I

clang中也存在类似的特性。

如果您使用 CMake,则可以指定SYSTEMfor include_directories

于 2014-11-24T11:13:56.750 回答
3
Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

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

于 2019-09-18T03:21:32.663 回答
0

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

于 2013-08-12T14:16:44.720 回答