AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[C-Präprozessor]

Ein Thema von Chewie · begonnen am 23. Okt 2004 · letzter Beitrag vom 24. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

[C-Präprozessor]

  Alt 23. Okt 2004, 12:39
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?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#2

Re: [C-Präprozessor]

  Alt 23. Okt 2004, 12:57
Der Preprocessor hat herzlich wenig mit dem Linker zu tun...
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#3

Re: [C-Präprozessor]

  Alt 23. Okt 2004, 13:12
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)
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: [C-Präprozessor]

  Alt 23. Okt 2004, 13:38
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#5

Re: [C-Präprozessor]

  Alt 23. Okt 2004, 17:55
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
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: [C-Präprozessor]

  Alt 23. Okt 2004, 18:32
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?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#7

Re: [C-Präprozessor]

  Alt 23. Okt 2004, 18:48
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!
Lukas
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#8

Re: [C-Präprozessor]

  Alt 23. Okt 2004, 19:36
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#9

Re: [C-Präprozessor]

  Alt 23. Okt 2004, 19:43
Zitat:
Genau das machst du unter Delphi.
Nein, das mache ich in C++!

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?
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#10

Re: [C-Präprozessor]

  Alt 23. Okt 2004, 20:01
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.
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 Uhr.
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