У меня есть проблема в этом коде, который можно скопировать 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++ жалуется в 1-м предупреждении на LogEntries::sDateTime
, тогда предупреждения исчезают.
Предупреждение также исчезает, когда я удаляю строку std::atomic<bool>
. Код очень прост; когда у вас есть g++ 4.9.2 проверьте это - это действительно очень странно.
EDIT: независимо от того, к какому элементу LogEntries struct
я добавляю инициализатор {}
, предупреждения исчезают.
Как можно объяснить такое поведение? Для меня это баг...
PS: Я считаю это ошибкой: измените спецификатор массива в этой строке на 1000:
LogEntries leLogEntries [1000] {};
g++ выдаст 5000 предупреждений! Я бы предположил, что нет смысла повторять предупреждение для каждого значения массива.
typedef struct { ... } name;
нельзя найти ни в одном известном мне учебнике по C++) - person Walter   schedule 21.03.2015