【问题标题】:gcc warning" 'will be initialized after'gcc 警告" '将在之后初始化'
【发布时间】:2009-10-14 08:11:28
【问题描述】:

我从无法修改的第 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_'

【问题讨论】:

  • 您能否发布几行实际警告?并告诉这是C,C++,如果你有源代码,警告是来自链接器还是编译过程?

标签: g++ suppress-warnings


【解决方案1】:

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

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

或者你可以转-Wno-reorder

【讨论】:

  • 为什么这很重要?为什么会出现此警告?
  • @Eloff 在某些情况下(不推荐),ba 的初始化可能相互依赖。天真的用户可能会尝试更改初始化顺序以获得一些效果,并且警告会清楚地表明它不起作用。
  • 那么声明的顺序是有语义的,即使声明之间没有关系?多么无意义!
  • 这并没有解释为什么这个警告存在并且引用-Wno-reorder 没有提及可能导致什么问题。我知道 OP 没有要求任何其他细节,但是如此高票数的答案我希望至少提及上下文和有关此问题的警告。难道我们不应该回答OP应该写的问题吗?
  • @cp.engr 成员按照他们的声明顺序进行初始化,而不是按照他们在 init-list 中的顺序进行初始化 - 因此,如果一个成员的初始化依赖于另一个成员,但声明会被交换,所以依赖 -在其依赖后被初始化后,很快就会有人过得很糟糕,因为那是纯粹的 UB。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 哇,你找到了一种新的方式来表达 RT_M:MIYF(男人是你的朋友)如果你不介意,我会用它:)
      【解决方案5】:

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

      clang 中存在类似功能。

      如果您使用 CMake,则可以将 SYSTEM 指定为 include_directories

      【讨论】:

      • 你能解释一下如何“指定SYSTEM”吗?
      • 只需将字符串`SYSTEM`放在include_directories行的末尾。
      【解决方案6】:
      Class C {
         int a;
         int b;
         C():b(1),a(2){} //warning, should be C():a(2),b(1)
      }
      

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • OP 想知道如何禁用警告,而不是它的含义或如何修复代码。事实上,帖子说代码是第三方的,不能修改。他们不能改变定义的顺序,可能也不能改变初始化的顺序。
        • 如果初始化列表中的第二个对象是从第一个对象初始化的,这非常确实很重要,但是它们在标题中被错误地声明了。在这种情况下,事情可能会变得非常奇怪。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        相关资源
        最近更新 更多