Warum beschränkt der Compiler die globale Variable, die immer mit einem konstanten Wert initialisiert wird? [Duplikat]

8

Lassen Sie mich dies veranschaulichen,

%Vor%

Jetzt bekomme ich den Kompilierungsfehler wie erwartet.

%Vor%

Was ich hier lernen möchte ist, warum bekomme ich den Fehler? Warum beschränkt der Compiler diese Operation? Ich verstehe, dass initialisierte globale Variablen in Datensegmenten gespeichert werden. Der Compiler könnte zuerst den Wert von a aufgelöst haben und dann b denselben Wert zugewiesen haben. Warum fehlt diese Funktion? Ist es komplex für Compiler zu tun? Gibt es Gründe für diese Funktionalität oder nur eine Falle von C?

    
dexterous_stranger 02.10.2013, 05:08
quelle

4 Antworten

11

Die offizielle Dokumentation aus Zeile 1644, 6.7.8 Initialisierung , sagt:

>
  

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

Warum die Regel existiert, ist eine schwierigere Frage - vielleicht, wie Sie vorschlagen, ist es schwierig für den Compiler zu tun. In C ++ ist ein solcher Ausdruck gültig, aber der globale Initialisierer kann Konstruktoren usw. aufrufen, während für C die Globalen in der Kompilierungsphase ausgewertet werden, um die Dinge kompakt zu halten. int b = a; ist zur Kompilierzeit auswertbar, aber was ist mit int b = a + c; ? %Code%? Wo würdest du aufhören? C entscheidet, dass es nicht die beste Lösung ist, wenn Sie nicht starten können.

    
Ken Y-N 02.10.2013, 05:26
quelle
4

Von Ihrem Kommentar:

  

... wie kann ich den Compiler zwingen, das zu machen?

Nun können Sie den Compiler nicht akzeptieren, was Sie haben, aber Sie können Ihr Ziel erreichen, indem Sie den Wert definieren, den Sie beiden Variablen zuweisen möchten.

%Vor%

Wenn Sie jetzt den Anfangswert ändern müssen, müssen Sie ihn nur an einer Stelle ändern;

    
Jim Rhodes 02.10.2013 05:53
quelle
1

C ist portabel zu sehr einfachen, kleinen Maschinen. Das Auswerten von Ausdrücken, die nicht konstant sind, erfordert Laufzeitcode in einer Funktion. In Embedded-Programmierung möchten Sie möglicherweise keine Funktionen (oder Code), die Sie nicht explizit programmiert haben.

Ihr Compiler wird den Initialisierer wahrscheinlich als Spracherweiterung auswerten, wenn er mit verschiedenen Optionen konfiguriert wird. Wenn das fehlschlägt, könnten Sie C ++ (sogar nur die C-ähnliche Untermenge) oder eine andere Sprache ausprobieren, die mehr Dinge tut, die Sie mögen: v).

    
Potatoswatter 02.10.2013 05:11
quelle
0

Andere haben angegeben, warum Initialisierer im Allgemeinen keine willkürlichen Ausdrücke sein dürfen.

Der Weg zu " erzwingt, dass der Compiler den Code akzeptiert " ist, den Code zu ändern . Die kanonische Methode zur willkürlichen Initialisierung des Dateibereichs externe Variablen (vulgo: "global") besteht darin, am Anfang von main () eine Initialisierungsfunktion aufzurufen, die die gesamte Initialisierung in der von Ihnen benötigten Reihenfolge vornimmt:

%Vor%     
Jens 02.10.2013 12:04
quelle

Tags und Links