ist mein compiler begriffsstutzig ?



  • Wenn Du in einer Headerdatei eine Variable ohne extern deklarierst, wird sie in jeder Übersetzungseinheit, die den Header einbindet neu deklariert.

    greetz, Swordfish



  • Swordfish schrieb:

    Wenn Du in einer Headerdatei eine Variable ohne extern deklarierst, wird sie in jeder Übersetzungseinheit, die den Header einbindet neu deklariert.
    greetz, Swordfish

    das ist doch der sinn einer header datei ? u.a. einer anderen übersetzungseinheit mitzuteilen, das irgendwo ein definierter speicherbereich existiert.
    ich muss es also jeder übersetzungseinheit, in der ich die variable benutzen will,
    neu deklarieren.

    wenn ich extern davor schreibe, dann deklariere ich die variable doch auch jedes mal neu, was ist denn daran anders ?



  • 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 Deklaration

    Deklarationen 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 - hat a hier nicht File Scope?

    greetz, Swordfish



  • Swordfish schrieb:

    Davon abgesehen, dass a = 0; quatsch ist - hat a 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 - hat a hier nicht File Scope?
    greetz, Swordfish

    ja, 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: 1

    da 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 😉


Anmelden zum Antworten