【问题标题】:gcc 4.9.2 bug in -Wmissing-field-initializers?-Wmissing-field-initializers 中的 gcc 4.9.2 错误?
【发布时间】:2015-03-21 15:25:56
【问题描述】:

我在这段代码中有一个问题 - 可以将其 1:1 复制到 cpp 文件中以测试行为:

#include <atomic>

typedef struct
{
    char                sDateTime [20];
    char                sLogFileDirectory [300];
    char                sLogFileNameTemplate [300];
    char                sLogOutput [10][100];
    std::atomic<bool>   bReadyToFlush;
} LogEntries;

typedef struct
{
    LogEntries              leLogEntries [1] {};
} LogThreads;

使用 gcc 4.9.2 SLES 11 SP2 g++ -std=c++11 gcc-warning-bug.cpp -Wall -Wextra -c 编译我收到这些非常奇怪的警告:

gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sDateTime’ [-Wmissing-field-initializers]
  LogEntries    leLogEntries [1] {};
                                  ^
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sLogFileDirectory’ [-Wmissing-field-initializers]
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sLogFileNameTemplate’ [-Wmissing-field-initializers]
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sLogOutput’ [-Wmissing-field-initializers]
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::bReadyToFlush’ [-Wmissing-field-initializers]

在这一行添加 {} 初始化器

std::atomic<bool>   bReadyToFlush {};

甚至 g++ 在第一个警告中抱怨 LogEntries::sDateTime 然后警告就消失了。

当我删除std::atomic&lt;bool&gt; 行时,警告也消失了。代码很简单;当你有 g++ 4.9.2 时检查一下 - 这真的很奇怪。

编辑:无论我向哪个LogEntries struct 成员添加{} 初始化程序,警告都消失了。

如何解释这种行为?对我来说这是一个错误......

PS: 我认为这是一个错误: 将此行中的数组说明符更改为 1000:

    LogEntries              leLogEntries [1000] {};

g++ 将产生 5'000 个警告!我认为对每个数组值重复警告并没有什么意义。

【问题讨论】:

  • 写C++风格的代码怎么样? (在我知道的任何 C++ 教程中都找不到typedef struct { ... } name;
  • @Walter:这是一个最初用纯 C 代码为 NVIDIA 的 CUDA 编写的项目。自上周二发布 CUDA 7.0 以来,我现在正在逐步将代码迁移到 C++11 标准中。谢谢你的评论,但这暂时不是重点。
  • @Walter:我同意 Al。进行您建议的微不足道的更改不会改变编译器的行为。 OP 的结构定义毕竟是有效的 C++。
  • @TonyK 这不是答案,只是评论。当然,这与问题没有直接关系。

标签: c++ c++11 gcc gcc-warning


【解决方案1】:

更新:

第一种情况现已被 GNU 确认,这是一个错误,但已在 gcc 5.0 中修复

ICE [Internal Compiler Error] 现在在错误数据库中 GNU bug database

这似乎是一个错误。我现在玩了一下,修改后编译器消息 gcc 由于内部错误而停止。

更新: 根据要求,gcc 无法编译的代码。编译器选项:g++ -std=c++11 gcc-warning-bug.cpp -Wall -Wextra -Werror -fno-strict-aliasing -fwrapv -fno-aggressive-loop-optimizations -c - 有一些选项是因为 GNU 要求它提供错误报告。

#include <atomic>

class LogEntries
{
public:
    char                sDateTime [20];
    std::atomic<bool>   bReadyToFlush;
};

class LogThreads
{
public:
    static LogEntries   leLogEntries [10];
};

LogEntries LogThreads::leLogEntries [10] {};

编译器失败,输出如下:

gcc-warning-bug.cpp:16:43: internal compiler error: in gimplify_init_constructor, at gimplify.c:4007
....
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.

我将准备示例代码并将其提交给开发团队。在我的项目中,成员 leLogEntries 是静态的。

当您删除 std::atomic 行时,它会起作用 --> std::atomic 实现中的问题?

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 2012-11-02
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2020-12-22
    • 2020-09-10
    相关资源
    最近更新 更多