У меня есть проблема в этом коде - который можно скопировать 1: 1 в файл CPP, чтобы проверить Behaving:gcc 4.9.2 ошибка в -Wmissing-field-инициализаторы?
#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 {};
даже г ++ жалуется на 1-е предупреждение о LogEntries::sDateTime
, тогда предупреждения ушли.
Предупреждение также исчезло, когда я удаляю линию std::atomic<bool>
. Код очень прост; когда у вас есть g ++ 4.9.2, проверьте это - это действительно очень странно.
EDIT: Независимо от того, к которому LogEntries struct
члену добавляет {}
инициализатору предупреждения ушли.
Как можно объяснить это поведение? Для меня это ошибка ...
PS: Я считаю это как ошибку: Изменение спецификатор массива в этой строке 1000:
LogEntries leLogEntries [1000] {};
г ++ будет производить 5'000 предупреждения! Я бы предположил, что на самом деле нет смысла повторять предупреждение для каждого значения массива.
Как насчет написания кода стиля С ++? ('typedef struct {...} name; 'не может быть найден ни в одном учебнике C++, о котором я знаю) – Walter
@Walter: Это проект, написанный сначала в чистом коде C для CUDA от NVIDIA. Поскольку CUDA 7.0 был выпущен в прошлый вторник, я теперь шаг за шагом переводил код в стандарт C++ 11. Спасибо за замечание, но на данный момент это не главное. –
@ Уолтер: Я согласен с Аль. Создание тривиального изменения, которое вы предлагаете, не изменяет поведение компилятора. Определение структуры OP после всех допустимых C++. – TonyK