a Bereits in b.obj definiert



  • du verletzt die ODR (one definition rule)



  • @ Shade

    Wieso? ERROR und SUCCESS sind nur ein einziges Mal definiert und zwar in constants.h, d.h. wie in dem Listing was ich oben gepostet habe.
    Ich habe schon alle anderen Quellcodedateien nach weiteren Definitionen von ERROR und SUCCESS durchsucht, doch ohne Erfolg, d.h. beide sind wirklich nur ein einzige Mal definiert.



  • Original erstellt von heute_heiße_ich_SMax:
    Wieso? ERROR und SUCCESS sind nur ein einziges Mal definiert und zwar in constants.h

    Einen Linkerfehler erhält, wer ein Objekt mehrfach definiet. Dies passiert am Ehesten, wenn man einen Header, der Objekte definiert, in zwei oder mehr cpp-Dateien einbindet.

    lies Humes text bitte nochmal und achte speziell auf den untersten source code!



  • Wieso? ERROR und SUCCESS sind nur ein einziges Mal definiert und zwar in constants.h, d.h. wie in dem Listing was ich oben gepostet habe.

    Nö. Der Preprozessor macht quais copy and paste. Das heißt es ist einmal in deiner main.cpp und einmal in jeder anderen Datei definiert, die constants.h einbinden. Versuch mal ein extern in constants.h vor die definition zu stellen (also eine deklaration draus zu machen) und eine weitere Datei mitzulinken, in der die Variablen definiert werden (z.B. constants.cpp).



  • Aber durch das #ifndef CONSTANTS_H kann doch constants.h nicht mehrfach eingebunden werden, sodass es - für den Fall das ERROR und SUCCESS wirklich nur einmal, nämlich in constants.h definiert sind - keine Mehrfacheinbindung geben dürfte.



  • const int SUCCESS = 0;
    const int ERROR = -1;



  • Durch die #include-Guards erreichst du nur, dass derselbe Header nicht mehrfach in eine Quellcodedatei eingebunden wird, z.B. durch gegenseitige #includes der Headerdateien untereinander.



  • @ ERROR_SUCCESS

    Danke, jetzt funktionert es. Aber wieso?



  • Original erstellt von Heute_heiße_ich_smax:
    Danke, jetzt funktionert es. Aber wieso?

    lies mal den Text von Hume!!

    da steht doch ganz eindeutig, dass die ODR verletzt wird, wenn du eine variable in mehreren ÜEs definierst.

    wenn du jetzt auch noch weißt was #include macht, dann sollte es klar sein.

    erklär mir mal:

    Was ist eine ÜE?
    Was macht #include?

    wenn du jetzt
    ÜE 1 hast:

    #include "constant.h"
    ...

    und in ÜE 2 dann:

    #include "contant.h"
    ...

    welchen code bekommt dann der compiler?
    (include wird ja bekanntlich vom preprozessor ersetzt)

    warum const int geht steht auch in Humes Text, bitte lies ihn!!



  • Außerdem ist es doch auch logisch, dass wenn du Konstanten haben willst, auch const davor schreiben solltest. 😉



  • @ ++

    Ja, das kann ich nachvollziehen 😃

    @ Shade

    Die one defintion rule (ODR) besagt, dass in einem Programm für jede Variable, jede Funktion, jede Klasse, jede Aufzählung und jedes Template nur genau eine Definition existieren darf.

    D.h. wenn man aus den Variablen SUCCESS und ERROR durch const Konstanten macht, dann wird die ODR nicht verletzt, weil für Konstanten mehrere Definitionen existieren dürfen (sorry, war gestern etwas schläfrig).



  • D.h. wenn man aus den Variablen SUCCESS und ERROR durch const Konstanten macht, dann wird die ODR nicht verletzt

    Richtig.

    weil für Konstanten mehrere Definitionen existieren dürfen (sorry, war gestern etwas schläfrig).

    Für Integer-Konstanten wird in der Regel überhaupt kein eigener Speicher angelegt.
    Außerdem gilt:
    a) "normale" Konstanten sind implizit static, haben also internal linkage. Demzufolge darf es eine Definition pro Übersetzungseinheit geben.

    b) extern deklarierte Konstanten dürfen nur *genau eine* Definition haben. Solange nur die Deklaration (extern const int bla;) im Header, die Definiton aber nur in *genau einer* cpp-Datei auftaucht ist alles ok.


Anmelden zum Antworten