2009-10-14 78 views
173

之后被初始化我从第三方代码中收到很多这些警告,我无法修改 有没有办法禁用此警告或者至少在某些区域禁用它(如#pragma PUSH/POP在VC++)gcc warning''将在'

?例如:。

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

你可以请张贴几行实际警告?还要告诉如果这是C,C++,并且如果有源代码,如果警告来自链接器或编译过程? – csl 2009-10-14 08:15:12

回答

277

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

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

,或者你可以把-Wno-reorder

+10

OP不能修改代码。 – 2010-12-17 04:41:46

+64

为什么这个重要的btw?为什么这个警告存在? – Eloff 2012-09-07 13:52:49

+30

@Eloff在某些情况下(不推荐),“b”和“a”初始化可能相互依赖。一个天真的用户可能会尝试改变初始化顺序以获得一些效果,并且警告会清楚地表明它不起作用。 – Gorpik 2013-01-28 16:17:00

28

你可以用-Wno-reorder禁用它

7

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

+5

哇,你找到了一种新的方式来说RT_M:MIYF(男人是你的朋友) 如果你不介意,我会用它:) – 2009-10-14 09:45:05

12

对于使用QT那些具有这种错误,这增加。 pro文件

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder 
1

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

+0

OP想知道如何禁用警告,而不是意味着什么或如何修复代码。事实上,该帖子说代码是第三方,不能修改。它们不能改变定义的顺序,也可能不是初始化的顺序。 – 2013-09-03 17:03:58

+0

如果init列表中的第二个对象是从第一个对象初始化的,但它们在头中被声明为错误的方法,那么它非常重要。在这种情况下,事情会变得很怪异。 – 2015-12-06 18:01:19

4

如果您看到来自库标题的错误并且正在使用GCC,则可以通过使用-isystem而不是-I来包含标题来禁用警告。

类似的功能存在于clang

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

+0

你能解释一下如何“指定SYSTEM”吗? – einpoklum 2016-02-12 14:22:57

+1

只需在'include_directories'行末尾放置字符串'SYSTEM'。 – 2016-02-12 15:20:19