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

LK_*_*K__ 214 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_'
Run Code Online (Sandbox Code Playgroud)

ura*_*ray 348

确保成员按照它们在类中显示的顺序出现在初始化列表中

Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}
Run Code Online (Sandbox Code Playgroud)

或者你可以转 -Wno-reorder

  • 为什么这很重要?为什么会出现此警告? (83认同)
  • @Eloff在某些情况下(不推荐),`b`和`a`初始化可能相互依赖.一个天真的用户可能会尝试改变初始化顺序以获得一些效果,而警告会明确表示它不起作用. (39认同)
  • 所以声明的顺序具有语义含义,即使声明之间没有关系?多么无意义! (22认同)
  • 这并没有解释_why_这个警告存在并引用了"-Wno-reorder"而没有提到可能导致的问题.我知道OP没有要求任何其他细节,但是这样一个高度投票的答案,我期望至少提到背景和围绕这一点的警告.我们不应该回答OP _should_写的问题吗? (8认同)
  • @cp.engr 成员按照其声明的顺序进行初始化,而不是在 init-list 中的顺序 - 因此,如果一个成员的初始化依赖于另一个成员,但声明被交换,因此被依赖者在其依赖之后被初始化,有人很快就会过得很糟糕,因为那是纯粹的UB。 (4认同)

Luk*_*ský 29

你可以用它来禁用它-Wno-reorder.


小智 16

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

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder
Run Code Online (Sandbox Code Playgroud)


use*_*627 8

Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}
Run Code Online (Sandbox Code Playgroud)

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


Las*_*loG 7

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

  • 哇,你找到了一种说RT_M的新方法:MIYF(男人是你的朋友)如果你不介意,我会用它:) (6认同)

Dre*_*kes 5

如果您看到来自库头文件的错误并且您正在使用 GCC,那么您可以通过使用-isystem代替包含头文件来禁用警告-I

类似的功能存在于clang 中

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