【发布时间】: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<bool> 行时,警告也消失了。代码很简单;当你有 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