C++ 解决有关初始化列表顺序与成员顺序不匹配的警告

C++ 解决有关初始化列表顺序与成员顺序不匹配的警告,c++,C++,我们需要在没有来自最高级别gcc警告的情况下编译我们的项目。目前,我们有很多关于以下方面的警告: struct Bob { int a; int b; Bob() : b(0) , a(0) { } }; 警告表示初始化列表的顺序与类中声明成员的顺序不匹配。我理解这个警告,因为初始化的真正顺序来自于类中成员的顺序,如果一些成员依赖于其他成员,则以相同的顺序排列初始化列表有助于发现bug 但是,我们有成吨(成吨)的代码,它

我们需要在没有来自最高级别gcc警告的情况下编译我们的项目。目前,我们有很多关于以下方面的警告:

struct Bob
{
    int a;
    int b;

    Bob()
        : b(0)
        , a(0)
    {
    }
};
警告表示初始化列表的顺序与类中声明成员的顺序不匹配。我理解这个警告,因为初始化的真正顺序来自于类中成员的顺序,如果一些成员依赖于其他成员,则以相同的顺序排列初始化列表有助于发现bug

但是,我们有成吨(成吨)的代码,它们的初始化列表与成员顺序不匹配,并且成员之间不相互依赖,因此没有问题。但我们必须从代码中删除所有警告

有什么自动的方法可以解决这个问题吗?我说过我们有很多代码吗

谢谢

您可以使用

-Wno-reorder
只需禁用这些警告。

您可以使用

-Wno-reorder

只需禁用这些警告。

假设您有人明智地要求您“没有警告”,则您可以请求异常并“禁用此警告”。它可能应该在一个文件一个文件的基础上完成,最好是使用一个书面的“未来修复计划”解决方案,而不是一个批发的“让我们对所有文件禁用此警告”

另一个选项是查找导致警告的所有位置,并重新排序初始值设定项


请注意,警告只是说“初始化的顺序与您编写的不同”,因此重新排序根本不会改变代码的行为-编译器已经为您重新排序了

假设您有一个明智的人要求您“无警告”,那么您可以请求异常并“禁用此警告”。它可能应该在一个文件一个文件的基础上完成,最好是使用一个书面的“未来修复计划”解决方案,而不是一个批发的“让我们对所有文件禁用此警告”

另一个选项是查找导致警告的所有位置,并重新排序初始值设定项



请注意,警告只是说“初始化的顺序与您编写的不同”,因此重新排序根本不会改变代码的行为-编译器已经为您重新排序了

那么为什么不在编译代码时启用这些警告呢?[和
-Werror
,这使得编译器在出现警告时拒绝生成对象文件-因此没有人能够在不修复警告的情况下通过最初的“编译测试”阶段]。因为我们生活在一个不完美的世界中,现在我需要解决这个问题。你能提供些帮助吗?这是可以做到的,但会很棘手。在让自动解决方案工作所需的时间内,您可能可以手动修复数百个构造函数。我会咬紧牙关。我建议,对于未来,您将这些标志添加到您的构建系统中!;)对于上面这样的简单类定义,您可以编写一个解析器来记住成员顺序,并读取和重新排序初始化列表。只需忽略过于复杂的typedef、函数和类定义(例如内部类等)。对于您的特定项目,应该可以在几个小时内用某种脚本语言编写这样的解析器,只是不要太花哨。它不会删除所有警告,但会删除大部分警告,因此您可以手动删除其余警告。请记住在转换后运行单元测试;)那么为什么不在编译代码时启用这些警告呢?[和
-Werror
,这使得编译器在出现警告时拒绝生成对象文件-因此没有人能够在不修复警告的情况下通过最初的“编译测试”阶段]。因为我们生活在一个不完美的世界中,现在我需要解决这个问题。你能提供些帮助吗?这是可以做到的,但会很棘手。在让自动解决方案工作所需的时间内,您可能可以手动修复数百个构造函数。我会咬紧牙关。我建议,对于未来,您将这些标志添加到您的构建系统中!;)对于上面这样的简单类定义,您可以编写一个解析器来记住成员顺序,并读取和重新排序初始化列表。只需忽略过于复杂的typedef、函数和类定义(例如内部类等)。对于您的特定项目,应该可以在几个小时内用某种脚本语言编写这样的解析器,只是不要太花哨。它不会删除所有警告,但会删除大部分警告,因此您可以手动删除其余警告。请记住在转换后运行单元测试;)…这是相当危险的。只能在本地使用,不能在命令行上使用!(哦,按下并弹出此诊断,使其仅在有限范围内有效。)谢谢,但我无法禁用警告。代码必须更改。@KonradRudolph Op有“吨”的代码。他不想修改所有文件。这是他自己的风险。@ SaldStist准许,但是你可以(也应该)把这些东西打包成一个“遗留”的包装头,然后把这些语法放在那些只包含的地方。@ NeilKirk,你正在寻找一些不是C++特定的脚本特征……这是相当危险的。只能在本地使用,不能在命令行上使用!(哦,按下并弹出此诊断,使其仅在有限范围内有效。)谢谢,但我无法禁用警告。代码必须更改。@KonradRudolph Op有“吨”的代码。他不想修改所有文件。这是他自己的风险。@ SaldStist准许,但你可以(也应该)把这些东西放入一个“遗留”的包装头中,然后把这些语法放在那些只包含的地方。@ NeilKirk,你正在寻找一些不特定于C++的脚本特征。