C: Zuweisen "static const char * const" zu "static const char *"
Ich habe ein Programm mit einigen globalen strings definiert, die am oberen Rand der Datei wie folgt:
static const char * const STRING_A = "STRING A";
static const char * const STRING_B = "STRING B";
Dann in die Hauptprogramm-Schleife, die ich immer wieder aufrufen einer Funktion. Diese Funktion enthält einen Zeiger, die auf den oben genannten Saiten, je nach Benutzereingabe. Standardmäßig möchte ich es so eingestellt werden, STRING_A, was ich so im wesentlichen haben, ist dies:
//Called repeatedly from a loop.
void input_function()
{
static const char *current = STRING_A;
//Do stuff and reassign different strings to "current"
...
}
Das problem, dass ich habe ist, dass beim kompilieren bekomme ich die Fehlermeldung "Fehler: element-Initialisierer ist nicht konstant". Dies ist mit GCC 4.7.2. Was verwirrt mich mehr, dass der Fehler verschwindet, wenn ich loszuwerden, die "static" - Schlüsselwort in der Eingabe-Funktion. Dies ist keine Lösung aber, wie Sie das Schlüsselwort static ist erforderlich für die Funktion zum verfolgen des aktuellen Strings zwischen den anrufen.
Natürlich habe ich dieses Problem beheben könnte in vielerlei Hinsicht die meisten einfach nur loszuwerden einige der const-Qualifizierer. Aber ich möchte verstehen, warum dies nicht funktioniert.
Mein Aktuelles Verständnis ist, dass die globalen string-Variablen können nicht geändert werden, um auf verschiedenen Saiten, und kann weder deren einzelne Zeichen geändert werden. Das static-Schlüsselwort, hält Sie lokal auf dem Quell-Datei.
Für die current
variable in meiner Funktion mein Verständnis ist, dass das statische-Schlüsselwort erlaubt es zu behalten Ihren Wert über mehrere Aufrufe der Funktion, und dass die const-Kennzeichner-in diesem Fall bedeutet, dass der string verweist current
ändern können - nicht aber die Zeichen der Zeichenfolge, die Sie zeigt.
Ich bin nicht zu sehen, alle Konflikte, die in diesen äußerungen, so verstehe ich nicht, warum der compiler gibt einen Fehler - vor allem, warum es nicht ein problem, wenn current
's "static" - Bezeichner entfernt.
Dank, wenn jemand erklären kann, was das problem hier ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
6.7.8/4 [C99]:
STRING_A
ist nicht, daher der Fehler.Einen Weg, dies zu umgehen, wäre entlang der folgenden Zeilen:
Weil
STRING_A
ist keine Konstante zur Kompilierungszeit. Ihre Interpretationen sind jedoch berechtigt, können Sie Sie nicht initialisieren eine Konstante zu sein, ein nicht-konstanter Wert (wieSTRING_A
).Woher weiß der compiler wissen, was
STRING_A
Punkte an, während es kompilieren? Tut Sie es nicht -STRING_A
wird an verschiedenen Adressen im nur-lese-Abschnitt des Speichers auf jede Ausführung des Programms, abhängig von, wo das string-literal im Speicher.Müssen Sie Folgendes tun, um dies zu umgehen Zurückhaltung beim Bezug die gleiche Wirkung: