Funktionskörper in header



  • Hi Leute

    ich habe eine böse Sache vor:

    Ich hab einige Funktionen ( keine Klassen ), die ich regelmäßig brauch und die deswegen bei mir als Header im Linux im allgemeinen Include-verzeichnis landen.
    Nun ist es aber so, dass ein dazugehöriges CPP-Source-File relativ unpraktisch wäre, weil man das dann noch zum Projekt hinzufügen muss und den ganzen Schnee...

    Daher würde mir das besser gefallen, wenn ich die Funktionskörper im Headerfile hätte 😉

    Andere Variante wäre, dass ich den ganzen Kram in eine statische Library, z.B. nen shared-object brenne und dagegen dann linke... Jedoch wäre mir die HeaderLösung irgendwie lieber.

    Oder ich baue aus alle Funktionen irgendwie Templates, wo ja standardmäßig alles nur in Headern liegt... ist aber auch nicht gerade schön...



  • Wo ist genau die Frage?

    Wenn du findest, dass es eine für dich passende Lösung ist, mach es so.

    Die Alternativen begründest, warum du sie nicht willst und dann ist es durchaus legitim ein Header File zu machen. Die Standardbibliothek macht das ja praktisch auch so. (Wenn aber aus einem anderen Grund)



  • Naja ich krieg dennoch ne Warnung...

    Eine Beispiel für eine Funktion ist diese hier ( ist durch Include-Guards abgesichert ):

    // Liefert die Zeit in Millisekunden seit Mitternacht
    static long GetAktTime()
    {
    	struct timespec tp;
    	clock_gettime( CLOCK_REALTIME, &tp );
        struct tm *ts = localtime( &tp.tv_sec );
        return (long)( ( ts->tm_hour * 3600 + ts->tm_min * 60 + ts->tm_sec ) * 1000 + ( tp.tv_nsec / 1000 / 1000 ) );
    }
    

    Wenn ich auf static verzichte, krieg ich ne "multiple definition"-Fehlermeldung.
    Mit static krieg ich : "warning: 'long int GetAktTime()' defined but not used".

    Gibt es da ne andere Möglichkeit, das Zeug ohne Fehler/Warnungen gebaut zu kriegen?



  • drakon schrieb:

    Die Standardbibliothek macht das ja praktisch auch so. (Wenn aber aus einem anderen Grund)

    Wie genau macht die Standardbibliothek es eigentlich?



  • It0101 schrieb:

    Gibt es da ne andere Möglichkeit, das Zeug ohne Fehler/Warnungen gebaut zu kriegen?

    Schreib inline davor.

    Für eine gute Idee halte ich es dennoch nicht, ich würde einfach eine Library draus machen.



  • Bashar schrieb:

    It0101 schrieb:

    Gibt es da ne andere Möglichkeit, das Zeug ohne Fehler/Warnungen gebaut zu kriegen?

    Schreib inline davor.

    Für eine gute Idee halte ich es dennoch nicht, ich würde einfach eine Library draus machen.

    wieso soll das keine gute idee sein?

    und die standard-lib implementierungen, setzen auch vor jede fkt ein inline, damit die ODR nicht verletzt wird.

    bb



  • Ich denke, dass es auf die Menge des Codes ankommt. Und es geht jetzt nicht darum, dass Code aufgebläht würde, was nicht der Fall sein sollte, wenn der Compiler da ein wenig mitdenkt, sondern eher rein vom Stil her. Wenn es wirklich eine Menge an Code ist, würde ich auch eher eine Lib dafür machen, welche das ganze schön verpackt usw. Andernfalls, wenn es wirklich nur ein paar Sachen sind, kann man die doch getrost in einen Header packen, den man included.



  • unskilled schrieb:

    wieso soll das keine gute idee sein?

    Weil es sich negativ auf die Kompilierzeit auswirkt. Einerseits durch das zusätzliche Parsen des grösseren Headers, andererseits muss Anwendungscode auch neu kompiliert werden, wenn nur die Implementierung geändert wird.

    unskilled schrieb:

    und die standard-lib implementierungen, setzen auch vor jede fkt ein inline, damit die ODR nicht verletzt wird.

    In der Standardbibliothek sind auch sehr viele Klassen und Funktionen Templates, da muss die Definition im Header stehen.



  • Nexus schrieb:

    unskilled schrieb:

    wieso soll das keine gute idee sein?

    Weil es sich negativ auf die Kompilierzeit auswirkt. Einerseits durch das zusätzliche Parsen des grösseren Headers, andererseits muss Anwendungscode auch neu kompiliert werden, wenn nur die Implementierung geändert wird.

    an der kompilierzeit ändert sich wohl im Vergleich nur etwas, wenn man pch nutzt und dort die datei included und die dann ändert. oder ne extrem große übersetzungseinheit die datei included - ansonsten ists komplett vernachlässigbar.
    das wäre dann zwar ärgerlich, aber ich find es besser als ne lib neu bauen zu müssen und dann noch die alte durch die neue ersetzen zu müssen.

    den zusatzaufwand beim ins projekt einbinden vs. nur includen, braucht man da noch gar nicht extra zu betrachten...

    Nexus schrieb:

    unskilled schrieb:

    und die standard-lib implementierungen, setzen auch vor jede fkt ein inline, damit die ODR nicht verletzt wird.

    In der Standardbibliothek sind auch sehr viele Klassen und Funktionen Templates, da muss die Definition im Header stehen.

    Jopp - wollt ich auch gar nich bestreiten - er hatte nur gefragt: "Wie genau macht die Standardbibliothek es eigentlich?"

    bb



  • Schön, dass sich hier noch eine kleine kontroverse Diskussion entwickelt hat.

    Also ich hab es nur aus dem Grund gemacht, um nicht ständig .cpp-Files zu Projekte hinzufügen zu müssen. Es ist wirklich nur eine Sammlung kleinerer nützlicher Funktionen. Es sind keine Klassen dabei. Templates sind auch einige dabei, aber bei denen ist es ja Standard.

    Wobei ich schon etwas überrascht bin. Normalerweise kommt Sourcecode ja nicht in Headerfiles 😉 Ich hatte eigentlich erwartet, dass ich hier ordentlich contra bekomme 🙂



  • Auch wenn ich grundsätzlich denke, dass man das durchaus im Header machen darf, finde ich, dass es ja nicht so schlimm ist da halt auch einen Ordner noch einzubinden, welcher halt noch ein paar Source Dateien mehr hat.

    Mache ich selber auch so. Da habe ich ein Framework, welches in jedem Projekt als Source kompiliert wird (weil ich doch auch ständig noch was ändere) und da muss ich einfach einen Ordner einfügen, welcher mir dann alle anderen Datien enthält. Kostet mich nicht einmal eine Minute bei der Erstellung des Projektes.



  • drakon schrieb:

    Auch wenn ich grundsätzlich denke, dass man das durchaus im Header machen darf, finde ich, dass es ja nicht so schlimm ist da halt auch einen Ordner noch einzubinden, welcher halt noch ein paar Source Dateien mehr hat.

    Mache ich selber auch so. Da habe ich ein Framework, welches in jedem Projekt als Source kompiliert wird (weil ich doch auch ständig noch was ändere) und da muss ich einfach einen Ordner einfügen, welcher mir dann alle anderen Datien enthält. Kostet mich nicht einmal eine Minute bei der Erstellung des Projektes.

    Vermutlich hast du Recht. Ich denke es wird bei mir auch auf eine solche Lösung hinauslaufen, weil ich auch noch einige Klassen habe, die ich öfter benötige und die will ich keinesfalls nur in einer Header-Datei unterbringen...



  • drakon schrieb:

    Auch wenn ich grundsätzlich denke, dass man das durchaus im Header machen darf, finde ich, dass es ja nicht so schlimm ist da halt auch einen Ordner noch einzubinden, welcher halt noch ein paar Source Dateien mehr hat.

    Habe ich mir auch heuer angewöhnt. Das Verzeichnis ist in den meisten Projekten nur als symlink drin, bei fertigen Projekten als Kopie.
    Was ich noch brauche, ist ein makefile pder ein make, das angangs nur die main.cpp compilieren will, aber zu jedem benutzen header foo.hpp auch die foo.cpp miterstellt.



  • volkard schrieb:

    drakon schrieb:

    Auch wenn ich grundsätzlich denke, dass man das durchaus im Header machen darf, finde ich, dass es ja nicht so schlimm ist da halt auch einen Ordner noch einzubinden, welcher halt noch ein paar Source Dateien mehr hat.

    Habe ich mir auch heuer angewöhnt. Das Verzeichnis ist in den meisten Projekten nur als symlink drin, bei fertigen Projekten als Kopie.
    Was ich noch brauche, ist ein makefile pder ein make, das angangs nur die main.cpp compilieren will, aber zu jedem benutzen header foo.hpp auch die foo.cpp miterstellt.

    Hmm das klingt gut. Da muss ich mal schauen, ob ich das Eclipse irgendwie beigebracht kriege 😉



  • volkard schrieb:

    drakon schrieb:

    Auch wenn ich grundsätzlich denke, dass man das durchaus im Header machen darf, finde ich, dass es ja nicht so schlimm ist da halt auch einen Ordner noch einzubinden, welcher halt noch ein paar Source Dateien mehr hat.

    Habe ich mir auch heuer angewöhnt. Das Verzeichnis ist in den meisten Projekten nur als symlink drin, bei fertigen Projekten als Kopie.

    Warum symlink? - Natürlich ist eine Möglichkeit, aber ich find es noch recht gut einfach nur den Pfad anzugeben (welcher in Wirklichkeit in ein anderes Projekt verweist). Ist ja eigentlich das selbe auf einer anderen Ebene, aber so habe ich keine Probleme, wenn ich viel synce.


Anmelden zum Antworten