2016-11-21 1 views
9

Ich bin ein Neuling und versuche zu verstehen Programm in C. Im Programm gibt es eine Header-Datei typedef.h, die erklärt typedef struct { int i; char b;} rdi;Clarify C Variablen

Dann gibt es 3 Ordner und jeder Ordner hat mehrere Programme zu verstehen, dass eine bestimmte Aufgabe ausführen und jeder Ordner hat eine Header-Datei. In der Header-Datei von je 3 Ordner hat es

#include typfedef.h 

und erklärte dann

extern rdi *rdi_x; 

In allen drei Ordner, die er es getan hat. Aber ich sehe es nicht, wo im Programm definiert:

rdi rdi_x; 

Meine Frage ist, ob es nicht erforderlich ist rdi rdi_x; im Programm zu definieren.

Wie ich von c-Lehrbüchern verstehe, irgendwo im Programm muss es rdi rdi_x; definieren oder mein Verständnis ist nicht gut.

+0

Wahr, R Sahu. Aber ist es keine Definition? (Eine Definition ist auch eine Deklaration). – Peter

+0

@Peter, nein. Es ist keine Definition. Es wird unter zwei Umständen definiert: 1. Es ist auch initialisiert. 'extern rdi * rdi_x = NULL;'. 2. Das 'extern' Schlüsselwort wird nicht verwendet. 'rdi * rdix_x;'. –

+5

'rdi rdi_x;' wäre ein Fehler, die Definition muss mit der Deklaration übereinstimmen, 'rdi * rdi_x;' –

Antwort

10

Wie ich aus c-Lehrbuch verstehe, irgendwo im Programm muss es rdi rdi_x; definieren oder mein Verständnis ist nicht gut.

Sie müssen rdi_x nur definieren, wenn es verwendet wird. Wenn die Variable deklariert wird, muss sie nicht definiert werden.

Nehmen Sie einen viel einfacheren Fall einer C-Datei:

Programm, das zu bauen, scheitert:

extern int i; 
extern int j; 
extern int k; 

int main() 
{ 
    k = 10; 
} 

Dieses Programm wird nicht bauen, da k verwendet wird. Wenn wir die Definition von nur k liefern, wird es gut bauen.

Programm, das erfolgreich erstellt:

extern int i; 
extern int j; 
extern int k; 

int main() 
{ 
    k = 10; 
} 

int k; 

Hier i und j deklariert, aber nicht verwendet. Daher müssen sie nicht definiert werden.

+1

Die Variable rdi_x wird in vielen Fällen verwendet im Programm. Deshalb bin ich verwirrt. –

+0

@abbc, das scheint seltsam. Mein Vorschlag für Sie ist zu versuchen, das Programm auf ein [mcve] zu reduzieren. Es ist sehr wahrscheinlich, dass Sie das Problem in diesem Prozess klarer verstehen werden. –

0

Immer wenn Sie #include verwenden, ist es so, als würden Sie den Code aus der Header-Datei in Ihr Programm einfügen.

Aus diesem Grund, wenn es in Ihrer Header-Datei typedef.h deklariert wurde, sollte es nicht notwendig sein, in der Klasse mit der Überschrift zu deklarieren.

Nun definieren, ist eine andere Geschichte, wie sie durch eine andere Antwort erwähnt, es hängt davon ab, wie Sie es

+0

Die Variable wird oft im Programm verwendet, deshalb bin ich verwirrt. –

+0

Wenn es im Programm verwendet wird und es nicht abstürzt, bedeutet dies, dass es bereits deklariert und definiert wurde, sonst läuft etwas sehr skizzenhaftes ab. Ich kann nicht genau sagen, was, ohne alle Klassen zu sehen, aber pls upvote, wenn es ein wenig half! – rtcode

4

Erstens verwenden möchten, die #include in den drei Quelldateien werden #include "typfedef.h", nicht #include typfedef.h sein. Die Anführungszeichen sind erforderlich.

Zweitens ist extern rdi *rdi_x eine Deklaration, aber keine Definition. Sie kann in einer beliebigen Anzahl von Quelldateien (oder in Header-Dateien) wiederholt werden und führt niemals dazu, dass rdi_x definiert wird.

Es ist auch notwendig, eine entsprechende Definition zu erstellen, zum Beispiel die gleiche Deklaration ohne das Schlüsselwort extern zu liefern.

rdi *rdi_x; 

Hinweis ist die * noch vorhanden. Ihre Beschreibung schlägt fälschlicherweise vor, dass eine Definition rdi rdi_x; (ohne die *) erforderlich ist.

Bedenken Sie, dass formal eine Definition eine Art von Deklaration ist. Die extern rdi *rdi_x ist eine Deklaration, aber keine Definition - weshalb sie wiederholt werden kann. Die Deklaration rdi *rdi_x ist eine entsprechende Definition - und unterliegt der "Ein-Definition-Regel" - mit anderen Worten, eine solche Definition muss einmal (und nur einmal) unter allen Übersetzungseinheiten in einem Projekt angegeben werden.

+0

Die Ein-Definition-Regel ist ein Teil von C++, nicht von C, IIRC. –

+0

Das Include ist mein Tippfehler. –

+3

@ Amin Negm-Awad. Richtig, aber es gibt Regeln im C-Standard, die den gleichen Nettoeffekt haben. Ein Beispiel für diesen Fall ist der C-Standard von 1999, Abschnitt J.2 "Undefiniertes Verhalten", Absatz 1 (der mit "Das Verhalten ist unter folgenden Umständen definiert:") beginnt. Der 78. nicht nummerierte Aufzählungszeichen nach dieser öffnenden Zeile sagt "Ein Bezeichner mit externer Verknüpfung wird verwendet, aber im Programm existiert nicht genau eine externe Definition für den Bezeichner, oder der Bezeichner wird nicht verwendet und es existieren mehrere externe Definitionen für den Bezeichner Kennung (6.9). " – Peter

2

Wenn Sie eine externe Klassenbibliothek oder Funktionsbibliothek verwenden, verfügt diese Bibliothek möglicherweise über eine Definition dieser Variablen (und ist für die Zuweisung des Speichers verantwortlich). Daher werden alle Deklarationen vom Linker aufgelöst, wenn Sie Ihren Code mit dieser Deklaration mit der Definition aus der von Ihnen verwendeten Bibliothek verknüpfen.