PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : #include über Kreuz



dml
14-01-2013, 08:46
Hallo,

ich habe mal wieder ein kleines Problem in c, wobei ich Euch um Eure Hilfe bitten möchte.
Funktionen kann man ja vor ihrer Initialisierung bekannt machen um sie vorher schon verwenden zu können, doch wie Funktioniert so etwas mit Variablen?

Beispiel
Ich habe zwei Dateien xsql.h und data.h in denen ich einige struct'e initialisiere. Doch das struct aus xsql.h enthält Variablen aus data.h und umgekehrt.

xsql.h


#include <sql.h> <-- Wichtige Variablendeklarationen
#include "datei.h"

typedef struct{
SQLINT stelle;
SQLCHAR type;
} Coldescribe;


typedef struct{
SQLINT a;
SQLCHAR c;
} XSql;

typedef struct{
SQLINT k;
XSql x;
Data d;
}XBig;




data.h


#include "XSql.h"

typedef struct{
int x;
Coldescribe desrcr;
} Data;


Ich könnte jetzt zwar das struct Coldescribe nach data.h verschieben und #include <sql.h> hinzufügen, doch eigentlich sollen die sql Deklarationen in xsql.h stehen. Auch zugegeben interessiert mich die Lösung des Problems.

Vielen Dank im Vorraus!
Grüße dml

anda_skoa
14-01-2013, 12:16
Ich könnte jetzt zwar das struct Coldescribe nach data.h verschieben und #include <sql.h> hinzufügen, doch eigentlich sollen die sql Deklarationen in xsql.h stehen.

Hmm, naja, da du ohnehin xsql.h in data.h inkludierst ist es schon eine Fortsetzung/Erweiterung von xsql.h, oder?


Auch zugegeben interessiert mich die Lösung des Problems.

Generell ist eine derartige zyklische Abhängigkeit oft ein Indikator, dass etwas nicht in Ordnung ist. Zum Beispiel dass Datentypen nicht korrekt entworfen wurden oder zuviel auf einmal beinhalten.

Eine Möglichkeit zumindest die Abhängigkeiten der Header zu durchbrechen sind Forward Declarations (obwohl ich mir da jetzt nicht sicher sind ob es die auch in C gibt, ich mache meistens C++).

Also in etwas so


struct Coldescribe;

typedef struct{
int x;
Coldescribe *desrcr;
} Data;


Dann muss der Header, in dem Coldescribe tatsächlich deklariert ist nur in den Dateien eingebunden werden, die mit Data.desrcr Interna arbeiten, bzw in der Datei, wo Data Instanzen angelegt werden (vermutlich data.c)

Ciao,
_

dml
14-01-2013, 13:58
Mein Logikfehler war, das ich Elemente von #include <sql.h> in data.h verwende und deshalb das struct Coldescribe nach data.h gehört, weshalb meine "Alles was mit Sql zu tun hat -> nach xsql.h" Ansicht falsch war.

Danke anda_skoa.