J'ai un problème dans ce code - qui peut être copié 1: 1 dans un fichier cpp afin de tester la comporter:gcc 4.9.2 bug dans -Wmissing-champ-initialiseurs?
#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;
avec gcc 4.9.2 Compiler SLES 11 SP2 g++ -std=c++11 gcc-warning-bug.cpp -Wall -Wextra -c
Je reçois ces très étranges avertissements:
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]
Ajout du {}
initialiseur dans cette ligne
std::atomic<bool> bReadyToFlush {};
même g ++ se plaint dans le 1er avertissement sur LogEntries::sDateTime
alors les avertissements ont disparu.
L'avertissement est également parti lorsque je supprime la ligne std::atomic<bool>
. Le code est très simple. quand vous avez g ++ 4.9.2 vérifiez - c'est vraiment très étrange.
EDIT: Peu importe à quel membre LogEntries struct
-je ajouter le {}
initialiseur les mises en garde sont partis.
Comment cela peut-il être expliqué? Pour moi, il est un bug ...
PS: je le considère comme un bug: Changer le spécificateur de tableau dans cette ligne à 1000:
LogEntries leLogEntries [1000] {};
g ++ produira 5'000 avertissements! Je suppose que cela n'a pas vraiment de sens de répéter l'avertissement pour chaque valeur de tableau.
Que diriez-vous d'écrire du code de style C++? ('typedef struct {...} name; 'ne peut pas être trouvé dans un tutoriel C++ que je connais) – Walter
@Walter: Ceci est un projet écrit en code C pur pour CUDA de NVIDIA. Depuis que CUDA 7.0 a été publié mardi dernier, je suis en train de migrer étape par étape le code en C++ 11 standard. Merci pour cette remarque mais ce n'est pas le moment pour le moment. –
@Walter: Je suis d'accord avec Al. Faire le changement trivial que vous suggérez ne change pas le comportement du compilateur. La définition de la structure de l'OP est après tout C++ valide. – TonyK