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


228

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

您能否发布几行实际警告?还要说明这是否是C,C ++,以及您是否有源码,警告是否来自链接程序或编译过程?
csl

Answers:


371

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

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

或者你可以转 -Wno-reorder


91
为什么这个重要的顺便说一句?为什么会出现此警告?
Eloff 2012年

40
@Eloff在某些情况下(不建议使用),b并且a初始化可能彼此依赖。天真的用户可能会尝试更改初始化顺序以获得某些效果,并且警告会明确指出它不起作用。
Gorpik

24
因此,即使声明之间没有关系,声明的顺序也具有语义含义?没意义!
Cuadue 2014年

10
这并不能解释为什么存在此警告并引用该警告,-Wno-reorder而未提及可能导致的问题。我知道OP并没有要求其他任何细节,但是我希望投票得到如此高的答复,至少要提及其背景和注意事项。我们不是应该回答OP 应该写的问题吗?
underscore_d

4
@ cp.engr成员是按照其声明的顺序进行初始化的,而不是按其在init列表中的顺序进行初始化-因此,如果一个成员的初始化依赖于另一个成员,但是声明被交换,以便被依赖项在其依赖项之后被初始化,有人很快就会遇到非常糟糕的时光,因为那是纯UB。
underscore_d


17

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

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

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


6
哇,您找到了一种表达RT_M的新方式:MIYF(男人是您的朋友)如果您不介意,我将使用它:)
Oren S


1

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


OP希望知道如何禁用警告,而不是意味着什么或如何修复代码。实际上,该帖子称该代码是第三方,无法修改。它们不能更改定义顺序,也可能不能更改初始化顺序。
Tim Seguine 2013年

非常喜欢事情,如果在init列表中的第二个对象是从第一对象INITD,但他们宣称在头部周围的错误的方式。在这种情况下,事情可能会变得很奇怪。
underscore_d 2015年

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.