Unterschied Definition Deklaration



  • Dann ist das hier in meinem Buch falsch?

    Es muss immer genau eine Definition für einen Namen in einem C++-Programm geben. Es kann allerdings viele Deklarationen geben.
    Alle Deklarationen einer Entität müssen beim Typ ihrer Entität übereinstimmen. Daher hat dieses Fragment zwei Fehler:
    
        int count;
        int count;  // Fehler: Redefinition
    .
    .
    .
    

    Wurden hier die Beide verwechselt? Denn wenn ich sowas kompiliere erhalte ich einen Deklerationsfehler und keine Definitionsfehler.



  • extern int i; // Deklaration
    int i; // Definition
    int i = 0; // Definition mit Initialisierung
    

    Lg freeG



  • Hier kann man jetzt über die verschiedenen Begriffe streiten. Ich würde bei Variablen von Deklaration und Initialisierung sprechen.

    int i;    //Deklaration
    i=5;      //Initialisierung (mit einem Wert)
    int i=5;  //beides in einem Rutsch
    

    Von einer Definition im Sinne einer Implementierung kann man ja hier nicht sprechen, da lediglich eine Instanz des Typs gebildet, aber nicht die Eigenschaften des Typs festgelegt werden (anders als z.B. bei der Definition von Funktionen, auf die wir uns zunächst bezogen hatten).



  • fr33g schrieb:

    extern int i; // Deklaration
    int i; // Definition
    int i = 0; // Definition mit Initialisierung
    

    Lg freeG

    Laut Wikipedia (http://de.wikipedia.org/wiki/Variablendeklaration) hast du Recht. Ich bin aber der Ansicht, dass man auch beim von dir als Zweites genannten Fall oft von einer Variablendeklaration spricht (und es ist ja für den Compiler auch eine Bekanntmachung). Ich denke, man kann beides gelten lassen. 🙂



  • So werden die Begriffe Deklaration und Definition im offiziellen C++ Standard benutzt:

    class foo;          // <-- Deklaration von foo
    
    class foo {         // <-- Definition  von foo
    public:
      int x;            // <-- Definition  von foo::x
      static int y;     // <-- Deklaration von foo::y
      void blah();      // <-- Deklaration von foo::blah
      int get() const { // <-- Definition  von foo::get als inline-Funktion
        return x;
      }
    };
    
    int foo::y;         // <-- Definition  von foo::y
    
    void bar(foo & f);  // <-- Deklaration von bar
    
    void bar(foo & f) { // <-- Definition  von bar
      f.x = 99;
    }
    
    extern int yay;     // <-- Deklaration von yay
    
    int yay;            // <-- Definition  von yay
    
    extern const int t; // <-- Deklaration von t
    
    extern const int t=2; // < Definition  von t
    

    Es gibt aber auch umgangssprachliche Variationen. ZB spricht man bei einer Klassendefinition oft von einer Klassendeklaration. Das hat wahrscheinlich auch mit dem Sprachvorgänger C zu tun, der mit den Begriffen laxer umgeht. Der C Standard verwendet die Begriffe "Deklaration" und "Definition" fast synonym (zumindest im Bezug auf Structs) und spricht lieber von "Funktions-Prototypen" als von "Funktions-Deklarationen".

    Eine Definition ist gleichzeitig auch Deklaration. D.H. Du musst nicht alles vorher deklarieren.

    Innerhalb einer Übersetzungseinheit (ÜE) sind keine Mehrfachdefinitionen erlaubt. Und für "normale" Funktionen und globale Variablen darf es auch Programm-weit nur eine einzige Definition geben. Eine Klassendefinition in einer Header-Datei, die per Textersetzung in mehreren Übersetzungseinheiten eingebunden wird, ist also okay, obwohl es dann mehr als eine Definition geben wird. Neben "normalen" Funktionen gibt es auch Funktions-Templates und Inline-Funktionen, für die es besondere Regeln gibt. Beispielsweise muss eine Inline-Funktion immer in einer ÜE definiert sein, wenn sie da auch benutzt wird. Typischerweise packt man Inline-Funktionen und Funktions-Templates auch in Header-Dateien rein, wenn man sie in mehr als einer ÜE benutzen will.

    kk



  • Das zweite da ist eine Deklaration und Definition.



  • In einem anderen Buch steht es in Deutsch übersetzt:

    extern int i; // Deklaration(Bekanntmachung)
    int i;        // Deklaration und Definition( also Bekanntmachung und Speicher reservieren)
    

    mit = ist es für mich auch immer gleich eine Initialisierung.



  • cppfrager schrieb:

    mit = ist es für mich auch immer gleich eine Initialisierung.

    wobei in manchen Fällen das = den entscheidenen Unterschied zwischen einer Deklaration und Definition macht:

    extern const int g;   // Deklaration
    extern const int g=3; // Definition mit Initialisierung
    

    und in anderen Fällen sogar für eine Deklaration benutzt werden kann:

    struct yyy {
      static const int e = 2; // DeKLARAtion mit Initialisierung
    };
    
    const int yyy::e; // Definition
    


  • Danke für die gute Erklärung.

    drakon schrieb:

    Das zweite da ist eine Deklaration und Definition.

    Er hatte doch geschrieben das eine Definition immer auch eine Deklaration ist, somit musste er es nicht immer mit hinschreiben.

    Ich wollte das alles nur nochmal bestätigt haben wenn ich das schon nicht begreifen muss ich mit den andren Themen erst garnicht anfangen. Ich will C++ "richtig" lernen und nicht nur halb 😃



  • dazu haben wir auch schon einen Text in der FAQ: http://www.c-plusplus.net/forum/viewtopic-var-t-is-61231.html



  • cppfrager schrieb:

    drakon schrieb:

    Das zweite da ist eine Deklaration und Definition.

    Er hatte doch geschrieben das eine Definition immer auch eine Deklaration ist, somit musste er es nicht immer mit hinschreiben.

    Ich habe das auf die Aussage von _matze bezogen.



  • Und da wir uns nun über die Begrifflichkeiten einig sind, können wir bestimmt gleich viel besser programmieren. 🤡



  • _matze schrieb:

    Und da wir uns nun über die Begrifflichkeiten einig sind, können wir bestimmt gleich viel besser programmieren. 🤡

    Nicht unbedingt, aber wenn man verschiedene Terminologien benutzt, dann ist jegliche Diskussion sinnlos. Darum sollte man sich erst mal über die Begriffe klar sein bevor man diskutiert. Und es macht Sinn, dass wir die Definitionen aus dem Standard verwenden und nicht die von wo anders.


Anmelden zum Antworten