C: Zuweisen von "statisch const char * const" zu "statisch const char *"

8

Ich habe ein Programm mit einigen globalen Zeichenfolgen, die am Anfang der Datei wie folgt definiert sind:

%Vor%

Dann rufe ich in der Hauptprogrammschleife wiederholt eine Funktion auf. Diese Funktion enthält einen Zeiger, der abhängig von der Benutzereingabe auf die obigen Zeichenfolgen zeigen soll. Standardmäßig möchte ich, dass es auf STRING_A gesetzt wird, also was ich im Wesentlichen habe, ist dies:

%Vor%

Das Problem, das ich habe ist, dass beim Kompilieren bekomme ich "Fehler: Initialisierungselement ist nicht konstant". Dies verwendet GCC 4.7.2. Was mich mehr verwirrt, ist, dass der Fehler verschwindet, wenn ich das "statische" Schlüsselwort in der Eingabefunktion loswerde. Dies ist jedoch keine Lösung, da das Schlüsselwort static benötigt wird, damit die Funktion die aktuelle Zeichenfolge zwischen Aufrufen verfolgen kann.

Natürlich könnte ich das auf viele Arten beheben, am einfachsten, indem ich einfach einige der const-Qualifier loswerde. Aber ich möchte verstehen, warum das nicht funktioniert.

Nach meinem derzeitigen Verständnis können die globalen String-Variablen nicht so geändert werden, dass sie auf unterschiedliche Strings zeigen, und auch ihre einzelnen Zeichen können nicht geändert werden. Das Schlüsselwort static behält sie lokal in der Quelldatei.

Für die Variable current in meiner Funktion verstehe ich, dass das Schlüsselwort static es erlaubt, seinen Wert über mehrere Aufrufe der Funktion beizubehalten, und dass das const-Qualifikationsmerkmal in diesem Fall bedeutet, dass der String auf current zeigt kann ändern - aber nicht die Zeichen der Zeichenfolge, auf die es zeigt.

Ich sehe keine Konflikte in diesen Anweisungen, deshalb verstehe ich nicht, warum der Compiler einen Fehler gibt - besonders warum es kein Problem hat, wenn der statische " current " - Spezifizierer entfernt wird.

Danke, wenn jemand erklären kann, was das Problem hier ist.

    
Adam Goodwin 10.08.2013, 15:48
quelle

2 Antworten

7

6.7.8 / 4 [C99]:

  

Alle Ausdrücke in einem Initialisierer für ein Objekt mit statischer Speicherdauer müssen konstante Ausdrücke oder Zeichenfolgenliterale sein.

STRING_A ist auch nicht der Fehler.

Eine Möglichkeit, dies zu umgehen, wären die folgenden:

%Vor%     
NPE 10.08.2013, 15:52
quelle
3

Das liegt daran, dass STRING_A keine Kompilierzeitkonstante ist. Ihre Interpretationen haben Recht, aber Sie können eine Konstante nicht als nicht konstanten Wert initialisieren (z. B. STRING_A ).

Wie weiß der Compiler, auf was STRING_A während der Kompilierung zeigt? Es wird nicht - STRING_A zeigt auf verschiedene Adressen im schreibgeschützten Speicherbereich bei jeder Ausführung des Programms, abhängig davon, wo sich das Zeichenfolgeliteral im Speicher befindet.

Sie müssten Folgendes tun, um diese Einschränkung zu umgehen und denselben Effekt zu erzielen:

%Vor%     
Jacob Pollack 10.08.2013 15:54
quelle

Tags und Links