externe Funktion ohne Header Datei - geht das? (c++)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
dakuan
Beiträge: 97
Registriert: 28.04.2011 22:09:39

externe Funktion ohne Header Datei - geht das? (c++)

Beitrag von dakuan » 18.08.2022 21:28:13

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.

JTH
Moderator
Beiträge: 3014
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: externe Funktion ohne Header Datei - geht das? (c++)

Beitrag von JTH » 18.08.2022 22:06:32

dakuan hat geschrieben: ↑ zum Beitrag ↑
18.08.2022 21:28:13
Würde der Linker die Funktion auch finden, wenn ich die Funktion in der Klassendatei als "extern" deklarieren würde?
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).

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.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: externe Funktion ohne Header Datei - geht das? (c++)

Beitrag von MSfree » 19.08.2022 08:06:33

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.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: externe Funktion ohne Header Datei - geht das? (c++)

Beitrag von tobo » 19.08.2022 09:39:17

Es gibt auch Programmiersprachen, die ohne Header auskommen
Ja, so kann man das auch sagen.

dakuan
Beiträge: 97
Registriert: 28.04.2011 22:09:39

Re: externe Funktion ohne Header Datei - geht das? (c++)

Beitrag von dakuan » 19.08.2022 14:44:56

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.

Antworten