Warnung in der externen Deklaration

8

Ich habe eine Variable i in temp2.h deklariert   extern i; , die nur eine über der Zeile enthält und machte eine andere Datei temp3.c

%Vor%

Als ich oben als kompiliert habe   cc -I ./ temp3.c Ich habe folgende Fehler erhalten:

%Vor%

Ich hatte oben in temp3.c extern erklärt, wie K R Seite 33 sagt, wie ich oben erwähnt habe. Ich habe einen anderen Weg für temp3.c mit der gleichen Header-Datei temp2.h

versucht %Vor%

und kompiliert es cc -I ./ temp3.c und bekam folgenden Fehler

%Vor%

Ich habe es auch versucht

%Vor%

kompiliert dieses

%Vor%

hat denselben Fehler wie in Post 1

%Vor%

Also habe ich mindestens 3 verschiedene Möglichkeiten ausprobiert, um extern zu verwenden, aber keiner von ihnen hat funktioniert.

    
reality displays 25.11.2010, 06:06
quelle

3 Antworten

14

Wenn Sie eine Variable mit extern deklarieren, sagen Sie dem Compiler, dass die Variable an anderer Stelle definiert wurde und die Definition zum Zeitpunkt der Verknüpfung bereitgestellt wird. Inklusion ist etwas ganz anderes.

extern

  

Eine externe Variable muss genau einmal außerhalb jeder Funktion definiert werden; Dies stellt Speicher für sie beiseite. Die Variable muss auch in jeder Funktion deklariert werden, die darauf zugreifen möchte; Dies gibt den Typ der Variablen an. Die Deklaration kann eine explizite externe Anweisung oder implizit aus dem Kontext sein.

     

-Die C-Programmiersprache

Eine Variable muss einmal in einem der Module (in einer der Übersetzungseinheiten) des Programms definiert werden. Wenn es keine oder mehr als eine Definition gibt, wird ein Fehler erzeugt, möglicherweise in der Verknüpfungsstufe (wie in Beispiel 1 und 2).

Versuchen Sie etwas wie das Folgende

a.c

%Vor%

b.c

%Vor%

Kompilieren, verknüpfen und erstellen Sie eine ausführbare Datei mit

%Vor%

oder

%Vor%

Verknüpfen Sie nun die Objektdateien und erstellen Sie eine ausführbare Datei

%Vor%     
Prasoon Saurav 25.11.2010, 06:12
quelle
4

Das erste Programm sagte:

  • Die Variable i (implizit vom Typ int ) ist irgendwo anders definiert - aber Sie haben sie nirgendwo definiert.

Das zweite Programm hat versucht, eine Variable zu verwenden, für die es überhaupt keine Deklaration gab.

Das dritte Programm hat versucht, eine Variable ohne einen expliziten Typ zu deklarieren (war OK, in C99 nicht erlaubt) und sagte:

  • Die Variable i ist irgendwo anders definiert, aber ich möchte sie hier initialisieren.

Das darfst du nicht tun.

Der Compiler ist also in allen Fällen korrekt.

Die Deklaration in der Kopfzeile 'temp2.h' sollte auf extern int i; first festgelegt werden. Das implizite int ist lange veraltet.

Sie könnten das erste Beispiel auf verschiedene Arten beheben:

%Vor%

Dies definiert die Variable nach der Funktion - zwar konventionell, aber legitim. Es könnte alternativ in einer separaten Quelldatei sein, die separat kompiliert und dann mit dem Hauptprogramm verknüpft wird.

Das zweite Beispiel könnte mit:

behoben werden %Vor%

Es ist wichtig zu beachten, dass dieses Beispiel jetzt zwei Variablen namens i ; der in temp2.h deklarierte (aber nirgendwo tatsächlich referenzierte) und der in main() definierte. Eine andere Möglichkeit, es zu beheben, ist die gleiche wie bei der ersten möglichen Lösung:

%Vor%

Wieder eine herkömmliche Platzierung, aber legitim.

Der dritte kann durch ähnliche Methoden wie die ersten beiden oder diese Variante behoben werden:

%Vor%

Dies deklariert weiterhin i in <temp2.h> , definiert es aber in der Quelldatei, die main() enthält (normalerweise platziert - am Anfang der Datei). Das extern int i; inneres main() ist doppelt redundant - die Definition in der Quelldatei und die Deklaration im Header bedeuten, dass es nicht innerhalb von main() neu deklariert werden muss. Beachten Sie, dass die Deklaration in der Kopfzeile und die Definition in der Quelldatei im Allgemeinen nicht redundant sind. Die Deklaration in der Kopfzeile bietet eine Konsistenzprüfung mit der Definition, und die anderen Dateien, die auch die Variable und die Kopfzeile verwenden, sind dann sicher, dass die Definition in der Datei main() der Definition entspricht, die die andere Datei ebenfalls verwendet .

    
Jonathan Leffler 25.11.2010 06:22
quelle
2

extern ist ein Deklarationsmechanismus, der dem Compiler sagt, dass die Variable in einer anderen Datei definiert ist.

Mein Vorschlag ist, dass Sie eine Variable in einer ".c" Datei definieren und dann die externe Deklaration in die entsprechende ".h" Datei einfügen. Auf diese Weise wird die Variablendeklaration für alle Quelldateien verfügbar sein, die diese Header-Datei enthalten, und es wird auch einfacher für einen zu identifizieren, in welchem ​​".c" er tatsächlich definiert ist.

    
Jay 25.11.2010 06:21
quelle

Tags und Links