2009-10-14 80 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