Mam program z niektórych globalnych ciągów zdefiniowanych na początku pliku jak poniżej:C: Przypisywanie "static const char * const" do "const static char *"
static const char * const STRING_A = "STRING A";
static const char * const STRING_B = "STRING B";
Następnie w programie głównym loop I wielokrotnie wywołuje funkcję. Ta funkcja zawiera wskaźnik, który ma wskazywać powyższe łańcuchy, w zależności od wprowadzonego przez użytkownika. Domyślnie chcę być ustawiony na STRING_A, więc to, co w istocie ma to:
// Called repeatedly from a loop.
void input_function()
{
static const char *current = STRING_A;
// Do stuff and reassign different strings to "current"
...
}
Problem, który mam jest to, że podczas kompilacji otrzymuję „Błąd: Element Inicjator nie jest stała”. Używa się GCC 4.7.2. Co bardziej mnie myli, to, że błąd zniknie, jeśli pozbędę się słowa kluczowego "static" w funkcji wejściowej. Nie jest to jednak rozwiązanie, ponieważ słowo kluczowe static jest potrzebne do śledzenia bieżącego ciągu znaków między wywołaniami.
Oczywiście mogłem to naprawić na wiele sposobów, najprościej mówiąc, po prostu pozbywając się niektórych z kwalifikatorów const. Ale chcę zrozumieć, dlaczego to nie działa.
Moje bieżące zrozumienie polega na tym, że globalne zmienne łańcuchowe nie mogą być modyfikowane w celu wskazania różnych ciągów znaków, a także nie można modyfikować ich indywidualnych znaków. Statyczne słowo kluczowe powoduje, że są one lokalne dla pliku źródłowego.
Dla zmiennej w mojej funkcji rozumiem, że słowo kluczowe static pozwala zachować jej wartość przez wiele wywołań funkcji, i że kwalifikator const w tym przypadku oznacza, że ciąg wskazany przez current
może się zmienić - ale nie znaki ciągu, który wskazuje.
Nie widzę żadnych konfliktów w tych stwierdzeniach, więc nie rozumiem, dlaczego kompilator daje błąd - szczególnie, dlaczego nie ma problemu, jeśli usunięto "statyczny" specyfikator current
.
Dzięki, jeśli ktoś może wyjaśnić, na czym polega problem.
jestem nadal zawijania moja głowa wokół niego, ale dzięki za szybką odpowiedź. –