Deklaration - Definition



  • AJ und ich können sich gerade nicht einigen was nun der Unterschied ist.

    AJs Meinung

    extern int x; // Deklaration
    int x; // Deklaration
    int x = 5; // Definition
    
    extern int x == int x
    

    SideWinders Meinung

    extern int x; // Deklaration
    int x; // Definition (Da Speicherbereitstellung)
    int x = 5; // Definition (Initialisierung)
    
    auto int x == int x
    

    Wer hat nun recht? 🙂

    MfG SideWinder



  • Hallo,

    ich würde sagen dass du recht hast:

    int x; // Definition (Da Speicherbereitstellung
    

    Das ist eine Definition. 🙂



  • Mist geschrieben.



  • Weil

    struct s {
       int x;
    };
    

    so viel Speicher belegt, richtig?



  • Um Daniel E.s Beitrag nochmal zu verdeutlichen:
    Side hat recht, aber die Begründung ist falsch.



  • Ist das also bloß per Definition (oder Deklaration *g*) so, oder gibts da auch noch eine tatsächliche Begründung?

    MfG SideWinder



  • Eine Deklaration ist eine Bekanntgabe: du sagst, es gibt irgendwas. Du sagst aber nicht wo und manchmal auch nicht genau was.

    Eine Definition ist mehr als nur eine Bekanntgabe - es ist zugleich eine exakte Erklärung um was es sich handelt. Und vorallem wo es ist, nämlich exakt hier 😉

    struct S;
    ist eine Bekanntgabe. Ich sage damit: Es gibt irgendwo eine struct mit Namen S. Ich sage aber nicht welche Member sie hat und wo sie definiert ist.

    struct S { int i; };
    Hier definiere ich die struct - denn ich gebe alle nötigen Informationen bekannt.

    Bei int i; hat der Compiler alle nötigen Informationen. Erst durch das extern enthalte ich ihm eine Informaton vor: nämlich wo die Variable definiert ist.



  • (Die C++-Faqs haben zu dem Thema gar nichts zu sagen. typedef-Gefrickel ist in C zB per Definition Definition, in C++ aber nicht.)

    Shade Of Mine schrieb:

    struct S { int i; };
    Hier definiere ich die struct - denn ich gebe alle nötigen Informationen bekannt.

    Bei int i; hat der Compiler alle nötigen Informationen.

    6.7#5 spricht:

    # A declaration specifies the interpretation and attributes of a set of identifiers. A definition
    # of an identifier is a declaration for that identifier that:
    # — for an object, causes storage to be reserved for that object;
    # — for a function, includes the function body;98)
    # — for an enumeration constant or typedef name, is the (only) declaration of the identifier.

    Ich wüssste nicht, wie ich daraus schließen könnte, 'int i' sei hier eine Definition (besonders, weil C in seiner Syntaxbeschreibung das Ding für einen Teil der struct-declarator-list hält).

    Noch ein kleines Quiz zum Abschluß: Ist

    int i;
    int i = 0;
    

    in legales C?



  • @Daniel E.: It depends? Oder?

    BTW: Auflösung noch abwarten und dann ab in die FAQ, so einen Beitrag gibt es bisher nur in der C++-FAQ und dort zählen offenbar andere Fakten 🙂

    MfG SideWinder


Anmelden zum Antworten