2017-06-20 3 views
2

Warum funktioniert dasKann nicht variabel auf eine extern'd Variable in C zuweisen

extern int externed_variable; 
int variable = externed_variable; 

nicht funktionieren Während diese

extern int externed_variable; 
int *variable_ptr = &externed_variable; 

Der Compiler-Fehler tut ich aus der ehemaligen bekommen ist „Ausdruck muss habe einen konstanten Wert ". Ich benutze MSVC.

+0

Welcher Bereich ist das? –

+0

Der Bereich ist global – hacksoi

+2

Das 'extern' Schlüsselwort sagt dem Compiler etwas wie" Mach dir keine Sorgen, dass du dieses Symbol hier nicht findest, es wird an anderer Stelle erklärt und wir werden es dem Linker überlassen, es herauszufinden ". Dann, wenn Sie es in der nächsten Zeile verwenden, sagt der Compiler "Ich weiß nicht, was das noch ist ..." –

Antwort

3

„Ausdruck muss einen konstanten Wert haben“

Wie der Fehler sagt, Wenn Sie eine Variable initialisieren, sollte es konstant sein.

In diesem Fall

extern int externed_variable; 
int variable = externed_variable; 

Sie sind mit einer "Variable" und Variable initialisiert wird Wert Laufzeit.

Aber wenn Sie dies tun:

extern int externed_variable; 
int *variable_ptr = &externed_variable; 

Sie Adresse zuweisen, Adressen für die globale Variable zur Compile-Zeit entschieden und somit konstant. Und Sie dürfen eine Variable mit konstantem Wert initiieren.

Um Ihnen zu antworten, wie Adressen für globale Variablen während der Kompilierung zugewiesen werden und konstant sind, erhalten Sie keinen Fehler!

+0

Bitte beachten Sie meinen Kommentar zu PSkocik – hacksoi

+0

@hacksoi Wenn Sie eine globale Variable deklarieren und ihr einen Wert zuweisen, wird die Variable im Code-Segment und der Anfangswert im Datensegment gespeichert. Wenn Sie das Programm ausführen, wird die Variable in den RAM geladen und dann wird der Wert aus DS abgerufen. Daher haben Sie keinen Wert bei der Verknüpfung von Zeit. – Swanand

+0

@Swanand Theoretisch könnten Sie den Wert bei der Verknüpfungszeit haben, aber nur, wenn Sie statisch verknüpfen oder der Wert nicht exportiert wird. – PSkocik

2

Globale Initialisierungen (genauer gesagt, Initialisierungen von Variablen mit statischer Lebensdauer) erfordern ganzzahlige Konstanten, da sie zur Ladezeit ausgeführt werden.

Alle Globals werden in der Regel zu einem Segment zusammengeklebt und auf einmal aus einem Binärbild initialisiert. Dies ist nur möglich, wenn Sie C mit einer Ganzzahlkonstanten und nicht mit einer Variablenreferenz angeben.

Die Regel der Standard, der dies erfordert, ist 6.7.9p4:

Alle Ausdrücke in einem Initialisierer für ein Objekt, das statisch oder Fadenspeicherdauer hat, darf konstante Ausdrücke oder String Literale sein.

+0

Wäre nicht der Wert der externen Variablen zur Verbindungszeit bekannt? Warum kann der Linker den Wert nicht auflösen? – hacksoi

+1

@hacksoi Standard-Linker handeln nur mit Etiketten und Adressen, AFAIK. Sie würden nicht wissen, wie viele Daten kopiert werden müssen. Ich denke, es wäre machbar, Ihren Linker und das Objektdateiformat zu ändern, damit Sie es tun können, aber dann könnten Sie einfach das Problem mit einem Makro lösen. – PSkocik

Verwandte Themen