Ich bin gerade dabei, ein größeres Projekt etwas zu erweitern und habe dazu eine neue Klasse erstellt (ist aber noch in der Entwicklung).
Jetzt stelle ich fest, dass ich darin auf eine Funktion in der Grunddatei zugreifen müsste. Das ist insofern problematisch, als dafür noch keine eigene Header-Datei existiert. Wenn ich diese erstellen würde, hätte sie ca. 200 Zeilen, die dann aber nur 2 public Funktionen enthielte. Das halte ich für etwas übertrieben.
Frage: Würde der Linker die Funktion auch finden, wenn ich die Funktion in der Klassendatei als "extern" deklarieren würde?
Ausprobieren konnte ich das bisher noch nicht, da ich noch in der Planungsphase bin und wohl noch ein oder zwei Tage benötige um überhaupt wieder etwas zu haben, was der Compiler abarbeiten kann. Da möchte ich dann nicht etwas machen, was ich am nächsten Tag wieder zurückdrehen muss.
externe Funktion ohne Header Datei - geht das? (c++)
Re: externe Funktion ohne Header Datei - geht das? (c++)
Wenn du eine freistehende (Nicht-Klassenmember-) Funktion meinst: Ja, das ist nichts anderes als das, was Headerdateien auch bewirken. Du musst sich nicht einmal extern deklarieren, das ist die „Standard“-Linkage einer freien Funktion, wenn nichts anderes explizit angegeben ist (external linkage).dakuan hat geschrieben:18.08.2022 21:28:13Würde der Linker die Funktion auch finden, wenn ich die Funktion in der Klassendatei als "extern" deklarieren würde?
Wenn du dich auf eine Klassenmemberfunktion beziehst (da es um C++ geht und du an einer Stelle „2 public Funktionen“ betonst): Wenn ich mich grad nicht ganz vertue – korrigiert mich: Nein, da geht das nicht so leicht. Da müsstest du die gesamte Klasse erneut & identisch definieren (Nachtrag: nur die benötigten Funktionen für die Klasse nochmal zu deklarieren hilft da nicht, das würde für die gesamte Klasse die so genannte One Definition Rule verletzen).
Manchmal bekannt als Just (another) Terminal Hacker.
Re: externe Funktion ohne Header Datei - geht das? (c++)
Der Linker interessiert sich überhaupt nicht für Quellcode (.c, .cpp) oder Header (.h, .hpp). Der nutzt nur Objectdateien (.o), Bibliotheken (.a, ein Archiv aus mehreren .o) und shared Objects (.so, Windows nennt das .dll), um daraus executables zu basteln.
Im Prinzip braucht man überhaupt keine Headerdateien, man kann alle Klassen und Prototypen auch direkt im .c/.cpp deklarieren. Weil das aber zu wiederholten Deklarationen führen würde, hat man diese Deklarationen in Header ausgegliedert, die per #include zum Quellcode vom Präprozessor eingefügt werden und zu einer Zwischendatei führen, die alle Deklarationen enthält. Erst die Zwischendatei (typischerweise als .i gekennzeichnet) wird vom Compiler in Maschinensprache übersetzt und als .o gespeichert. (die .i werden wieder gelöscht, was aber mit Compileroptionen verhindert werden kann).
Es gibt auch Programmiersprachen, die ohne Header auskommen, z.B. Pascal und seine Nachfolger.
Im Prinzip braucht man überhaupt keine Headerdateien, man kann alle Klassen und Prototypen auch direkt im .c/.cpp deklarieren. Weil das aber zu wiederholten Deklarationen führen würde, hat man diese Deklarationen in Header ausgegliedert, die per #include zum Quellcode vom Präprozessor eingefügt werden und zu einer Zwischendatei führen, die alle Deklarationen enthält. Erst die Zwischendatei (typischerweise als .i gekennzeichnet) wird vom Compiler in Maschinensprache übersetzt und als .o gespeichert. (die .i werden wieder gelöscht, was aber mit Compileroptionen verhindert werden kann).
Es gibt auch Programmiersprachen, die ohne Header auskommen, z.B. Pascal und seine Nachfolger.
Re: externe Funktion ohne Header Datei - geht das? (c++)
Ja, so kann man das auch sagen.Es gibt auch Programmiersprachen, die ohne Header auskommen
Re: externe Funktion ohne Header Datei - geht das? (c++)
Da habe ich mich wohl wieder ungenau ausgedrückt. Ja, es geht um eine Methode des Hauptprogramms, also da wo alle Fäden zusammenlaufen.
Da werde ich wohl eine andere Lösung finden müssen. Aber eine Lösung mit Callbacks und set_irgendwas() erscheint mir nicht sehr elegant.
Da werde ich wohl eine andere Lösung finden müssen. Aber eine Lösung mit Callbacks und set_irgendwas() erscheint mir nicht sehr elegant.