![]() |
[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:
So sieht das ganze bei mir aus. Leider bleibt die Linker-Fehlermeldung erhalten. Was mach ich falsch?
#if !defined (MATRIX_INCLUDED)
#define MATRIX_INCLUDED void ersteFunktion() {} int zweiteFunktion() {} #endif |
Re: [C-Präprozessor]
Der Preprocessor hat herzlich wenig mit dem Linker zu tun...
|
Re: [C-Präprozessor]
Hallo,
das macht man so:
Code:
(Methodenrümpfe am im Header-File i.A. nix zusuchen)
#ifndef _INCLUDE_MATRIX_H
#define _INCLUDE_MATRIX_H void ersteFunktion(); int zweiteFunktion(); #endif _INCLUDE_MATRIX_H |
Re: [C-Präprozessor]
Zitat:
@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. |
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:
|
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?
|
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! |
Re: [C-Präprozessor]
Zitat:
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. |
Re: [C-Präprozessor]
Zitat:
Zitat:
Wieso wird dadurch das Programm größer? |
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 17:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz