Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C-Präprozessor] (https://www.delphipraxis.net/32441-%5Bc-praeprozessor%5D.html)

Chewie 23. Okt 2004 11:39


[C-Präprozessor]
 
Ich hab eine C-Header-Datei, die auch Funktionsdefinitionen enthält. Da diese Header-Datei in mehreren Quellcodedateien eingebunden werden muss (MFC lässt grüßen...), wirft mir der Linker natürlich Fehlermeldungen vor den Kopf, dass Symbole doppelt definiert sind. Also dachte ich mir, die Datei in ein #if !(define) .. #endif - Konstrukt zu setzen, was aber nicht funktioniert.

Code:
#if !defined (MATRIX_INCLUDED)
#define MATRIX_INCLUDED

void ersteFunktion() {}
int zweiteFunktion() {}

#endif
So sieht das ganze bei mir aus. Leider bleibt die Linker-Fehlermeldung erhalten. Was mach ich falsch?

w3seek 23. Okt 2004 11:57

Re: [C-Präprozessor]
 
Der Preprocessor hat herzlich wenig mit dem Linker zu tun...

fiasko 23. Okt 2004 12:12

Re: [C-Präprozessor]
 
Hallo,

das macht man so:

Code:
#ifndef _INCLUDE_MATRIX_H                                                        
#define _INCLUDE_MATRIX_H                                                        

void ersteFunktion();
int zweiteFunktion();

#endif _INCLUDE_MATRIX_H
(Methodenrümpfe am im Header-File i.A. nix zusuchen)

Chewie 23. Okt 2004 12:38

Re: [C-Präprozessor]
 
Zitat:

Zitat von w3seek
Der Preprocessor hat herzlich wenig mit dem Linker zu tun...

Stimmt, aber das was der Präprozessor ausspuckt wird kompiliert und das kompilierte anschließend gelinkt.

@fiasko: #ifndef und #if !defined(xx) ist das gleiche. Und die Rümpfe hab ich in die Header-Datei gepackt, da sie da eigentlich dazugehören. Aber ich werd sie dann wohl doch besser in eine Code-Datei packen, dann löst sich das Problem.

fiasko 23. Okt 2004 16:55

Re: [C-Präprozessor]
 
Was haben denn Funktionsrümpfe in Header files zusuchen (mit Ausnahme von inline Funktionen)??? Was hat man denn sonst in den normalen C-Files noch drinne :gruebel:

Chewie 23. Okt 2004 17:32

Re: [C-Präprozessor]
 
Ja, hast ja Recht. Da ich das ganze C-Konzept mit Header- und Quelltextfiles nicht so ganz verstehe, wärs so leichter gewesen. Aber wenn ich die Methoden in einer Headerdatei deklariere, in einer Quellcodedatei definiere, muss ich dann ja nur die Headerdatei in meine anderen Quellcodedateien einbinden, um auf die Funktionen zugreifen zu können, oder?

Tubos 23. Okt 2004 17:48

Re: [C-Präprozessor]
 
Hmmm, interessantes Thema.
Ich schreibe die Funktionen immer in Header-Dateien.
Was ist dagegen zu sagen?
Wieso sollte ich die an einem Ort deklarieren und woanders schreiben? Ist doch umständlicher!

OregonGhost 23. Okt 2004 18:36

Re: [C-Präprozessor]
 
Zitat:

Wieso sollte ich die an einem Ort deklarieren und woanders schreiben? Ist doch umständlicher!
Genau das machst du unter Delphi. Dort hast du einen interface- und einen implementation-Abschnitt. In C/C++ ist die Header-Datei der interface-Abschnitt, und die Implementierungs-Datei halt der implementation-Abschnitt.

Das hängt damit zusammen, dass es kein Unit-Konzept in C/C++ gibt. Aus diesem Grund müssen externe Funktionen dem Compiler bekannt gemacht werden, indem sie deklariert werden, und wenn du das nicht jedesmal selbst machen willst, überlässt du es dem Präprozessor, der auch nicht mehr macht, als die #include-Direktive durch den Inhalt der Header-Datei zu ersetzen.
Wenn du jetzt die Funktionen in der Header-Datei implementierst und diese in mehreren Quellmodulen einbindest, wird jedes dieser Module eine Kopie der Funktion enthalten, das heißt, du bläst den Objektcode unnötig auf. Alternativ beschwert sich wie in Chewies Fall der Linker, dass er gleichnamige Funktionen mehrmals erhält und diese binden soll.

Aus diesem Grund ist es notwendig, Deklaration und Implementierung von Funktionen (und korrekterweise auch von Daten) strikt zu trennen.

Tubos 23. Okt 2004 18:43

Re: [C-Präprozessor]
 
Zitat:

Genau das machst du unter Delphi.
Nein, das mache ich in C++! :mrgreen:

Zitat:

Wenn du jetzt die Funktionen in der Header-Datei implementierst und diese in mehreren Quellmodulen einbindest, wird jedes dieser Module eine Kopie der Funktion enthalten, das heißt, du bläst den Objektcode unnötig auf. Alternativ beschwert sich wie in Chewies Fall der Linker, dass er gleichnamige Funktionen mehrmals erhält und diese binden soll.
hmm, aber ich schütze meine Header durch die oben genannte Methode vor Mehrfach-Inkludierung!
Wieso wird dadurch das Programm größer?

fiasko 23. Okt 2004 19:01

Re: [C-Präprozessor]
 
Hallo,

bei ein C Programm erzeugst du mehrere Object-Files die dann gelinkt werden. Jetzt hat aber jedes .o File seine eigene Version von deinen Funktionen... und der Linker macht dann auch mehrere unterschiedliche draus (behaubte ich jetzt mal so ohne genaures wissen :-).

Wenn allerdings in den Header Files nur die Deklarationen enthalten ist, dann ist der Compiler erstmal überall glücklich weil er einen Prototypen zur hand hat und der Linker erkennt dann das die ganzen .o Files eine externe Referenz auf die Funktionen haben und kann die dann gegen den einzig existierenden Funktionsrumpf aus dem .c-File linken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz