2017-02-17 3 views
0

Ich habe die folgenden Variablen am Anfang meiner Datei definiert, direkt nach meinen #include Anweisungen;Initialisieren von Globalen mit Variablen in C

int a = 5; 
int b = a; 

Aber ich bekomme einen Kompilierzeitfehler. Ich weiß, dass globale Variablen implizit statische Speicherdauer haben, aber ich bin mir nicht sicher, wie oder ob dies mit der Ursache dieses Fehlers zusammenhängt.

+2

Sie müssen konstante Ausdrücke verwenden, die zur Kompilierzeit vollständig ausgewertet werden können. Der Wert in "a" ist keine Konstante (auch wenn Sie "const" hinzufügen). Sie könnten 'int * p = & a;' verwenden - die Adresse von 'a' ist eine Kompilierzeitkonstante (Verbindungszeit). Wenn Sie globale Variablen aus komplexeren Ausdrücken wirklich initialisieren müssen, benötigen Sie C++. –

Antwort

0

Wie Sie gesagt haben, haben globale Variablen implizit statische Speicherdauer. Dies liegt daran, dass globale Variablen während der Kompilierungszeit initialisiert werden. Das ist genau der Grund, warum Sie einen Fehler bekommen.

Von C99-Standard 6.7.8:

Alle Ausdrücke in einem Initialisierer für ein Objekt, die statische Speicherdauer hat, darf konstanter Ausdrücke oder Zeichenkette sein.

Um diese Regel zu umgehen, können Sie den folgenden "Trick" verwenden.

int a = 5; 
int b; 

int main() 
{ 
    b = a; 
    //rest of code goes here. 
} 
+0

Ich weiß das. Ich frage mich, warum das so ist. Ich denke, ich frage, warum der Compiler es so braucht. – BlaqICE

+0

Auf diese Weise wird der Initialisierungscode für die globalen Variablen nicht benötigt. Das Programm beginnt mit den vorinitialisierten globalen Variablen. Dies wäre nicht möglich, wenn Sie den Code verwenden, den Sie in Ihrer Frage verknüpft haben. – nikaltipar