Często używam tablic literałów łańcuchowych w moim kodzie C. Te tabele wyglądają mniej więcej tak:
static const char* const stateNames[STATE_AMOUNT] =
{
"Init state",
"Run state",
"Pause state",
"Error state",
};
Problem z powyższym kodem polega na tym, że jeśli tabela się wydłuża i jest modyfikowana podczas programowania, od czasu do czasu zapominam przecinek. Kod kompiluje się bez problemu z brakującym przecinkiem, ale mój program kończy się awarią, gdy ostatni ciąg jest ustawiony na NULL
. Do weryfikacji użyłem kompilatorów MinGW i Keil.
Czy istnieje sposób wygenerowania ostrzeżenia kompilatora dla mojej inicjalizacji, jeśli brakuje przecinka?
c
initialization
Jonny Schubert
źródło
źródło
Odpowiedzi:
Zawijanie co
const char*
parę nawiasów powinno rozwiązać problem, jak pokazano w poniższym fragmencie:Jeśli zapomnisz przecinek, pojawi się błąd kompilacji podobny do:
error: called object is not a function or function pointer
DEMO NA ŻYWO
Zauważ, że jeśli zapomnisz przecinek, tak naprawdę dzieje się tak, że C faktycznie połączy dwa (lub więcej) ciągi znaków do następnego przecinka lub końca tablicy. Powiedzmy na przykład, że zapomniałeś przecinka, jak pokazano poniżej:
Oto, co
gcc-9.2
generuje (inne kompilatory generują podobny kod):Oczywiste jest, że ostatnie trzy ciągi są połączone, a tablica nie jest długością, jakiej można by oczekiwać.
źródło
Możesz pozwolić kompilatorowi zliczyć tablicę i wygenerować komunikat o błędzie, jeśli nieoczekiwany wynik:
W tym wątku znajdziesz pomysły na wdrożenie,
_Static_assert
jeśli Twój kompilator jest bardzo stary i nie obsługuje go.Jako bonus, może to również pomóc przy dodawaniu nowych stanów, ale zapomnij zaktualizować tabelę ciągów. Ale możesz także przyjrzeć się Makrom X.
źródło
Zawsze użyłem odwołania do tablicy o wyraźnie określonym rozmiarze, aby to rozwiązać.
http://coliru.stacked-crooked.com/a/593fc2eac80782a6
źródło
Nie pomaga to kompilatorowi, ale pisanie go tak jak poniżej ułatwia ludziom nie pozostawianie przecinka:
źródło