ist mein compiler begriffsstutzig ?
-
Ich hab' eben nochmal nachgelesen:
ISO/IEC 9899-1999 (E) schrieb:
6.9.2 External object definitions
Semantics
If the declaration of an identifier for an object has file scope and an initializer, the
declaration is an external definition for the identifier.Somit ist es egal, ob du nun
extern
davor schreibst, oder nicht. Ohne Typ - was dein Compiler mokiert - geht's natürlich nicht.greetz, Swordfish
-
Ich sehe nicht wo
int a;
file scope haben sollte...int a; ist übrigens eine Definition
extern int a; ist die DeklarationDeklarationen kommen in Header und Definitionen in .c Dateien.
Ein bisschen komplizierter sieht das mit structs aus, deshalb klammere ich die mal aus
-
Shade Of Mine schrieb:
Ein bisschen komplizierter sieht das mit structs aus...
wieso? ist doch das selbe prinzip.
-
Shade of Mine schrieb:
Ich sehe nicht wo
int a;
file scope haben sollte...Quote aus dem zweiten Post des OP:
no compre schrieb:
// a.h int a; // a.c #include "a.h" a=0; // main.c #include "a.h" #include <stdio.h> int main() { printf("%d", a ); }
Davon abgesehen, dass
a = 0;
quatsch ist - hata
hier nicht File Scope?greetz, Swordfish
-
Swordfish schrieb:
Davon abgesehen, dass
a = 0;
quatsch ist - hata
hier nicht File Scope?Gute Frage, bevor ich was falsches sage, passe ich lieber. Aber es fühlt sich ohne extern irgendwie falsch an...
-
Swordfish schrieb:
...Davon abgesehen, dass
a = 0;
quatsch ist - hata
hier nicht File Scope?
greetz, Swordfishja, gibs mir ordentlich
auch wenns möglicher weise quatsch ist, trotzdem ist es doch unlogisch, das der
compiler die storage class oder den type vermisst ?die '#include "a.h" - anweisung' sagt doch in worten aus:
nimm den datei-inhalt von a.h und füge ihn an dieser stelle ein, ne?dann hätte ich da also stehen:
// a.c
int a; // anstelle von #include "a.h"
a=0;den typen int müsste er dann also sehen, meinem verständnis nach
-
Shade Of Mine schrieb:
int a; ist übrigens eine Definition
wird da etwa schon speicherplatz reserviert ?
ich habe gelesen, das man von einer definition dann spricht, wenn speicherplatz reserviert wird und das es sich sonst um eine deklaration handelt.
-
no compre schrieb:
den typen int müsste er dann also sehen, meinem verständnis nach
Du verkennst das Problem: Die Anweisung a=0 ist ausserhalb einer Funktion schlicht nicht zulässig. Das hat nichts damit zu tun, dass der Compiler a nicht kennt. Die Definition mit Initialisierung ("int a=0") ist aber ein anderes Konstrukt und ausserhalb von Funktionen sehr wohl erlaubt.
Und ja, die Definition reserviert Speicherplatz. Daraus ergibt sich aus einem bereits genannten Satz von Swordfish: "Wenn Du in einer Headerdatei eine Variable ohne extern deklarierst, wird sie in jeder Übersetzungseinheit, die den Header einbindet neu definiert." Sprich, in jeder ÜE möchte der Compiler dafür Speicher reservierten. Deshalb eine Definition, beliebig viele (identische) Deklarationen.
-
LordJaxom schrieb:
Und ja, die Definition reserviert Speicherplatz. Daraus ergibt sich aus einem bereits genannten Satz von Swordfish: "Wenn Du in einer Headerdatei eine Variable ohne extern deklarierst, wird sie in jeder Übersetzungseinheit, die den Header einbindet neu definiert." Sprich, in jeder ÜE möchte der Compiler dafür Speicher reservierten. Deshalb eine Definition, beliebig viele (identische) Deklarationen.
ich habe doch in der headerdatei int a; stehen. das ist doch gar keine definition.
darum kann ich doch den header so oft einbinden wie ich will, ohne das jedes mal neu speicherplatz reserviert wird?
bei einer neudefinition würde doch der compiler meckern!
oder wie erklärt sich folgendes:// a1.h int a; // a2.h int a; // a1.c #include "a1.h" #include "a2.h" void set1() { abc = 1; } void show1() { printf("show1: %d\n", abc ); } // a2.c #include "a1.h" #include "a2.h" int abc = 0x815; void set2() { abc = 2; } void show2() { printf("show1: %d\n", abc ); } // main.c #include "a1.h" #include "a2.h" extern void set1 (); extern void set2 (); extern void show1(); extern void show2(); int main() { set1(); set2(); show1(); show2(); set2(); set1(); show1(); show2(); }
Ausgabe:
show1: 2
show2: 2
show1: 1
show2: 1da kann man doch sehen, das nur ein speicherplatz existiert.
-
no compre schrieb:
ich habe doch in der headerdatei int a; stehen. das ist doch gar keine definition.
darum kann ich doch den header so oft einbinden wie ich will, ohne das jedes mal neu speicherplatz reserviert wird?
bei einer neudefinition würde doch der compiler meckern!Genau das wollte ich mit
ISO/IEC 9899-1999 (E) schrieb:
6.9.2 External object definitions
Semantics
If the declaration of an identifier for an object has file scope and an initializer, the
declaration is an external definition for the identifier.sagen.
Der Standard impliziert an dieser Stelle, da die Deklaration File Scope hat ein
extern
greetz, Swordfish
PS: Ich schreib das
extern
dazu, damit alle Klarheiten beseitigt sind