J'utilise beaucoup de tables littérales de chaînes dans mon code C. Ces tableaux ressemblent tous plus ou moins à ceci:
static const char* const stateNames[STATE_AMOUNT] =
{
"Init state",
"Run state",
"Pause state",
"Error state",
};
Le problème avec le code ci-dessus est que si la table s'allonge et est modifiée pendant le développement, j'oublie de temps en temps une virgule. Le code se compile sans problème avec une virgule manquante, mais mon programme finit par se bloquer lorsque la dernière chaîne est définie sur NULL
. J'ai utilisé les compilateurs MinGW et Keil pour vérifier.
Existe-t-il un moyen de générer un avertissement du compilateur pour mon initialisation si la virgule est manquante?
c
initialization
Jonny Schubert
la source
la source
Réponses:
Envelopper chaque
const char*
parenthèse dans une paire devrait résoudre le problème, comme illustré dans l'extrait de code suivant:Si vous oubliez une virgule, vous obtiendrez une erreur de compilation similaire à:
error: called object is not a function or function pointer
DÉMO EN DIRECT
Notez que si vous oubliez la virgule, ce qui se passe réellement est que C concatène réellement les deux (ou plus) chaînes jusqu'à la prochaine virgule, ou la fin du tableau. Par exemple, supposons que vous oubliez la virgule comme indiqué ci-dessous:
C'est ce qui
gcc-9.2
génère (d'autres compilateurs génèrent du code similaire):Il est clair que les trois dernières chaînes sont concaténées et que le tableau n'a pas la longueur attendue.
la source
Vous pouvez laisser le compilateur compter le tableau et générer un message d'erreur en cas de résultat inattendu:
Voir ce fil pour des idées à implémenter
_Static_assert
si votre compilateur est très ancien et ne le supporte pas.En prime, cela peut également vous aider lorsque vous ajoutez de nouveaux états mais oubliez de mettre à jour la table des chaînes. Mais vous voudrez peut-être également examiner les macros X.
la source
J'ai toujours utilisé une référence à un tableau de taille explicite pour résoudre ce problème.
http://coliru.stacked-crooked.com/a/593fc2eac80782a6
la source
Cela n'apporte pas le compilateur pour vous aider, mais je trouve que l'écrire comme ci-dessous permet aux humains de ne pas laisser de virgule plus facile:
la source