Ich verwende häufig String-Literal-Tabellen in meinem C-Code. Diese Tabellen sehen alle mehr oder weniger so aus:
static const char* const stateNames[STATE_AMOUNT] =
{
"Init state",
"Run state",
"Pause state",
"Error state",
};
Das Problem mit dem obigen Code ist, wenn die Tabelle länger wird und während der Entwicklung geändert wird, vergesse ich von Zeit zu Zeit ein Komma. Der Code wird problemlos mit einem fehlenden Komma kompiliert, aber mein Programm stürzt ab, wenn die letzte Zeichenfolge auf gesetzt ist NULL
. Ich habe die MinGW- und Keil-Compiler zur Überprüfung verwendet.
Gibt es eine Möglichkeit, eine Compiler-Warnung für meine Initialisierung zu generieren, wenn das Komma fehlt?
c
initialization
Jonny Schubert
quelle
quelle
Antworten:
Wenn Sie alle
const char*
in Klammern setzen, sollte das Problem wie im folgenden Ausschnitt gezeigt gelöst werden:Wenn Sie ein Komma vergessen, wird ein Kompilierungsfehler angezeigt, der ähnlich ist wie:
error: called object is not a function or function pointer
LIVE DEMO
Beachten Sie, dass wenn Sie das Komma vergessen, C tatsächlich die zwei (oder mehr) Zeichenfolgen bis zum nächsten Komma oder dem Ende des Arrays verkettet. Angenommen, Sie vergessen das Komma wie folgt:
Dies wird
gcc-9.2
generiert (andere Compiler generieren ähnlichen Code):Es ist klar, dass die letzten drei Zeichenfolgen verkettet sind und das Array nicht die erwartete Länge hat.
quelle
Sie können den Compiler das Array zählen lassen und bei unerwartetem Ergebnis eine Fehlermeldung generieren:
In diesem Thread finden Sie Ideen zur Implementierung,
_Static_assert
wenn Ihr Compiler sehr alt ist und ihn nicht unterstützt.Als Bonus kann dies auch hilfreich sein, wenn Sie neue Status hinzufügen, aber vergessen, die Zeichenfolgentabelle zu aktualisieren. Vielleicht möchten Sie sich aber auch mit X-Makros befassen.
quelle
Ich habe immer einen Verweis auf ein Array mit expliziter Größe verwendet, um dies zu lösen.
http://coliru.stacked-crooked.com/a/593fc2eac80782a6
quelle
Dies bringt den Compiler nicht dazu, Ihnen zu helfen, aber ich finde, dass das Schreiben wie unten es für Menschen einfacher macht, kein Komma zu setzen:
quelle