C++ Besonderheiten



  • Hallo,

    ich habe bislang nur Java programmiert und versuche gerade mich in C++ einzuarbeiten. Mit Erschrecken stelle ich fest, daß viele Sachen ungleich komplizierter sind. Ein gewisses Grundverständnis habe ich mittlerweile, aber auf 2 Fragen finde ich keine rechte Antwort. Ich hoffe Ihr könnt und wollt mir helfen:

    1.) In Java enthält jede Datei eine Klasse, eine Klasse beinhaltet die Mainmethode (im Normalfall). Eine Instanz einer anderen Klasse kann problemlos durch "new" erzeugt werden. Jede Klasse wird kompiliert und man erhält für jede Klasse eine .class Datei.
    Wie ist das in C++, wenn ich mehrere Dateien habe? Wie "finden" die sich? Enthält jede Datei eine Klasse? Erhalte ich beim Kompilieren trotzdem nur eine .exe?

    2.) In vielen Fällen ist es notwendig zusätzliche Headerdateien einzubinden. Diese enthalten meines Wissens nur die Prototypen der Funktionen. Ausprogrammiert sind diese in den dazugehörigen Libraries. Soweit richtig?
    Ich hatte ein Beispiel, da musste ich eine .h Datei einbinden und die entsprechende .lib Datei dazulinken. Allerdings war dies mehr ein zufälliges Finden der entsprechenden .lib. Woher weiss ich, welche Library zu welcher Headerdatei passt? Warum muss ich z.B. math.h einbinden aber keine dazugehörige Library linken?

    Alle die bis hierhin gelesen haben
    mfg und vielen dank



  • Hallo,

    ich bin in solchen Sachen kein Experte, da kommen mit Sicherheit noch hilfreichere Antworten. Aber in C++ muss man überhaupt keine Klassen haben, denn man kann auch prozdual programmieren. Es werden beim Kompilieren Objektedateien erstellt (was aber nix mit Objektorientierung zu tun hat), die dann später zu einem Programm (also eine .exe) gelinkt werden.

    Warum muss ich z.B. math.h einbinden aber keine dazugehörige Library linken?

    Ich weiss nicht, welchen Compiler du benutzt, aber ich muss beim gcc immmer -lmath mit angeben, wodurch dann die math library dazugelinkt wird.



  • Torsten W. schrieb:

    1.) In Java enthält jede Datei eine Klasse, eine Klasse beinhaltet die Mainmethode (im Normalfall). Eine Instanz einer anderen Klasse kann problemlos durch "new" erzeugt werden. Jede Klasse wird kompiliert und man erhält für jede Klasse eine .class Datei.
    Wie ist das in C++, wenn ich mehrere Dateien habe? Wie "finden" die sich? Enthält jede Datei eine Klasse? Erhalte ich beim Kompilieren trotzdem nur eine .exe?

    Man hat Dateien, in denen Funktionen stehen (es müssen nicht zwangsweise Klassen sein). Die Main-Funktion steht in keinem namespace und in keiner Klasse, diese existiert nur in Headern (.h und .cpp). Beim kompilieren, werden .o (Object Files) erzeugt, und dann vom Linker zu einer Exe zusammengelinkt.

    Torsten W. schrieb:

    2.) In vielen Fällen ist es notwendig zusätzliche Headerdateien einzubinden. Diese enthalten meines Wissens nur die Prototypen der Funktionen. Ausprogrammiert sind diese in den dazugehörigen Libraries. Soweit richtig?

    Nein. Bei den Standard Headern werden keine Libraries benötigt. Die Funktionen stehen in den Headern, die mit includiert werden.
    Libraries enthalten nicht den Prototypen. (Jedenfalls nicht die Linux .so-Dateien)

    Zum Beispiel iostream:

    #include <bits/c++config.h> // Hier stehen
    #include <ostream>          // die
    #include <istream>          // Funktionen
    

    mfg



  • Torsten W. schrieb:

    Wie ist das in C++, wenn ich mehrere Dateien habe? Wie "finden" die sich? Enthält jede Datei eine Klasse? Erhalte ich beim Kompilieren trotzdem nur eine .exe?

    Du hast Header Dateien (.hpp), und Implementierungsdateien (.cpp) (Namen sind Schall und Rauch).

    Eine .hpp Datei bietet nur Deklarationen, Klassendefinitionen, inline definition,... an (siehe One Definition Rule). Bei Templates muss zB alles inline sein - da es 'export' zwar theoretisch gibt (um dieses Problem zu umgehen), praktisch es aber kein Compiler kann.

    Eine .hpp Datei inkludiert 0 oder mehr .hpp Dateien, aber niemals eine .cpp Datei.

    Eine .cpp Datei ist eine Übersetzungseinheit. In ihnen sind die ganzen Definition (von Variablen, Funktionen,...). Sie wird zu einer Objektdatei (*.o, *.obj,...) kompiliert. Diese sind nur bedingt mit .class Dateien vergleichbar, da sie nicht ausführbar sind.

    Eine .cpp inkludiert 0 oder mehr *.hpp Dateien - und nie eine .cpp Datei.

    Diese Objektdateien werden dann vom Linker zu einem richtigen Programm gelinkt (gelinkt deshalb, weil kein Code generiert wird - sonst die Objektdateien nur zusammengefügt werden).

    Eine Library (*.lib, .a) ist eine Sammlung von Objektdateien. Ähnlich wie eine Dynamische Library (.dll, *.so) - mit dem Unterschied, dass eine .lib nichts eingebständiges ist. Man kann eine .lib nicht ausführen (da es ja nur eine Sammlung von Objektdateien ist).

    Der Linker nimmt nun die Objektdateien aus der .lib raus - und linkt das fertige Programm.

    Welcher Header welche lib verlangt, kann man der Dokumentation entnehmen. Normalerweise verwendet man auch nicht unzählig viele Libraries 🙂 Und wenn doch, dann hilft eine IDE mit der Verwaltung.

    Sollte man nicht alle nötigen Sachen linken, erhält man 'undefined reference' Fehler.

    Sollte man zuviel linken, dann erhält man 'already defined' Fehler (siehe auch One Definition Rule)

    Windowsspezifisch:
    Eine .dll ist eine dynamische Library - sie ist im Prinzip etwas eigenständiges. Oft gibt es auch .lib Dateien zu .dll Dateien - die das 'statische' linken ermöglichen. Statisch ist nicht ganz richtig, aber die .dll wird dann dan das Programm gebunden. Wenn man das Programm startet wird die passende .dll gesucht - wenn sie nicht gefunden wird, gibt es einen Fehler und das Programm startet nicht.

    Wenn man keine passende .lib hat, dann muss man die .dll dynamisch laden (LoadLibrary())

    Unter Linux ist es ähnlich.

    Dies ist etwas vereinfacht ausgedrückt

    btw:
    die C++ Standard Library hat durchaus auch Libraries - diese werden aber (verständlicherweise) defaultmäßig mitgelinkt.

    Natürlich hat nicht jede Headerdatei eine eigene Library - und einige haben garkeine (wegen Templates).


Anmelden zum Antworten