Headerfiles und doppelte Deklarationen
lima-city → Forum → Programmiersprachen → C/C++ und D
compiler
datei
eingebauten netzwerkkarte
funktion
guard
hallen
konto
meinst
modul
programmierer
prozessor
reden
schutz
semikolon
thw
uebrigens
verschiebung
verstehe
vorschlag
wrde
-
Hall?che,
heute brauch ich mal Hilfe in C :-)
Also, ich habe ein Projekt das aus drei Modulen besteht, und jedes Modul hat ein Headerfile: list.h, ktov.h und konto.h. In list.h wird u.a. ein struct mit dem Namen tList definiert (unter Verwendung von typedef. Das Modul ktov.c bindet das Headerfile list.h mit #include ein, und alles ist gut.
Jetzt wollte ich aber eine Funktion im Modul kotno.c schreiben, die einen Pointer auf ein tList als Argument bekommt. Ein Prototyp dieser Funktion kommt dann wiederum ins zugeh?rige Headerfile konto.h:
void ShowGUI(tList*);
Jetzt beschwert sich der Compiler, dass er tList nicht kennt (wird ja in einem anderen Headerfile deklariert). Wenn ich list.h auch noch in dieses Headerfile einbinde, werde ich (zu Recht) mit Fehlermeldungen ?berh?uft, dass diverse Typen (u.a. tList) doppelt deklariert sind.
Gib es eine M?glichkeit, dieses Problem (elegant) zu l?sen? Eigentlich m?chte ich nicht, dass Headerfiles andere Headerfiles einbinden. Aber bei der Sache mit dieser Typendeklaration hab ich leider keine andere M?glichkeit gesehen :-/
Und au?erdem muss ich ja irgendwie noch meine Funktion ShowGUI bekannt machen...
MfG,
thw -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
in _C_ _so_ gar nicht.
pack halt die struktur definition in ne haeder die du dann includierst.
oder du verlegst das typedef. -
Die L?sung ist irgendwie Standard und wird ?berall verwendet, deswegen wundert mich der letzte Beitrag etwas.
Einfach jede Header-Datei so aufbauen:
---- anfang -------
#ifndef blablubb
#define blablubb
[ hier der eigentliche Inhalt]
#endif
---- ende -------
Statt blablubb nimmst du einfach etwas Eindeutiges. Meist nimmt man dazu einfach den Namen der Header-Datei selbst. Bei tolletools.h also ungef?hr so:
#ifndef TOLLETOOLS_H
Bei sehr grossen Projekten, an denen mehrere Programmierer arbeiten nimmt auch oft noch die MAC-ID der im Rechner eingebauten Netzwerkkarte dazu, um m?gliche ?bereinstimmungen mit defines anderer Programmierer zu verhindern. Sieht ungef?hr so aus:
#ifndef TOLLETOOL_H__000102A62F72
#define TOLLETOOL_H__000102A62F72
Die Zahl hinten ist die MAC-ID im Hex-Format.
cpttanga hat zwar in dem Punkt Recht, dass es in C gar nicht geht, weil die defines ja durch den Pr?prozessor bearbeitet werden, aber 1. kenne ich keinen C-Compiler ohne Pr?prozessor und 2. hat er ja eh auf namespaces in C++ angespielt. -
Cool, klar, danke sch?n. Die L?sung ist zu einach, auf sowas kommt man doch nicht 8)
Hab da halt noch nicht wirklich viel Praxiserfahrung.
Auf jeden Fall vielen Dank!
MfG,
thw -
0-checka:
das was du dort praesentierst nennt sich include guards und von denen war keine rede.
sie schuetzen lediglich vor mehrfachincludierung von headern. laesst sich unter anderem auch mit
#pragma once
erreichen.
verstehe nicht was du mit namespaces meinst.
aber dir helfen include guards wenig wenn du ein in c mit typedef definierten typen predefinieren willst (wie von mir angenommen). dazu musst du halt wie schon vorgeschlagen den typedef verschieben (wobei die struct dann nicht mehr anonym waere) oder die strukturdefinition in einen weiteren externe header verlegen.
ich meine mit verschiebung des typedefs uebrigens sowas hier:
typedef T_ T /*typedef kann nicht mehr direkt bei der strukturdefinition stehen*/
int main()
{
T* p;
/*p verwenden*/
return 0;
}
struct T_
{
/*...*/
};
ps. in c++ wuerde das mit der predeclaration nicht so ein problem darstellen wie in c. -
cpttanga schrieb:
0-checka:
das was du dort praesentierst nennt sich include guards und von denen war keine rede.
sie schuetzen lediglich vor mehrfachincludierung von headern.
Genau dies ist aber das Problem des Threader?ffners gewesen.
cpttanga schrieb:
ich meine mit verschiebung des typedefs uebrigens sowas hier:
[...]
Wird in C nicht funktionieren. Ich sehe daher nicht, wie Dein Vorschlag weiterhelfen soll.
cpttanga schrieb:
verstehe nicht was du mit namespaces meinst.
Ich dachte, du spielst auf namespaces an, hab mich aber wohl geirrt. -
0-checka schrieb:
cpttanga schrieb:
0-checka:
das was du dort praesentierst nennt sich include guards und von denen war keine rede.
sie schuetzen lediglich vor mehrfachincludierung von headern.
Genau dies ist aber das Problem des Threader?ffners gewesen.
gut war ein verstaendnissfehler meinerseits.
0-checka schrieb:
cpttanga schrieb:
ich meine mit verschiebung des typedefs uebrigens sowas hier:
[...]
Wird in C nicht funktionieren. Ich sehe daher nicht, wie Dein Vorschlag weiterhelfen soll.
haette den code wohl nicht gepostet wenn er nicht in c funktionieren wuerde ;) -
0-checka schrieb:
cpttanga schrieb:
ich meine mit verschiebung des typedefs uebrigens sowas hier:
[...]
Wird in C nicht funktionieren. Ich sehe daher nicht, wie Dein Vorschlag weiterhelfen soll.
haette den code wohl nicht gepostet wenn er nicht in c funktionieren wuerde ;)
Ich will jetzt niemandem zu nahe treten, aber dein Code funktioniert in C (mit dem GCC 4.0.2) tats?chlich nicht... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage