Nutzung eines structs aus anderer Quelldatei
-
Ich soll Unit-Tests für eine Bibliothek eines Kunden schreiben, ohne diese zu ändern.
Nun werden dort structs in C-dateien definiert, die ich für die Unit-Tests benötige.
Im Moment kopiere ich diese Srukturen in meine Unit-Test Datei, aber der Compiler warnt (völlig zu Recht) dass die Typen eventuell inkompatibel sind.
Gibt es irgend eine Möglichkeit eine Struktur aus einer anderen Übersetzungseinheit zu übernehmen?
Da ich den Code der Bibliothek nicht ändern soll ist, sehe ich keine Mögliochkeit einfach eine Header-Datei anzulegen.
-
shisha schrieb:
Ich soll Unit-Tests für eine Bibliothek eines Kunden schreiben, ohne diese zu ändern.
Nun werden dort structs in C-dateien definiert, die ich für die Unit-Tests benötige.
Im Moment kopiere ich diese Srukturen in meine Unit-Test Datei, aber der Compiler warnt (völlig zu Recht) dass die Typen eventuell inkompatibel sind.
Gibt es irgend eine Möglichkeit eine Struktur aus einer anderen Übersetzungseinheit zu übernehmen?
Da ich den Code der Bibliothek nicht ändern soll ist, sehe ich keine Mögliochkeit einfach eine Header-Datei anzulegen.
nicht ausprobiert, aber was vielleicht gehen kann: den code in den c-dateien mit #ifndef TYPES_ONLY
...
#endif
umschließen. die struct-definitionen natürlich nicht. und dann in dem testcode die c-datei includen:
#define TYPES_ONLY
#include "c-code.c"
#undef TYPES_ONLY
// jetzt deine tests^^ nur ne fixe idee. vielleicht gehts ja.
-
shisha schrieb:
Da ich den Code der Bibliothek nicht ändern soll ist, sehe ich keine Mögliochkeit einfach eine Header-Datei anzulegen.
Dem Kunden sagen, dass seine Codebasis scheiße ist und
struct
s für so einen Test in einen Header gehören geht nicht? Weil sonst ist die Einschränkung arbiträrer Schwachsinn, und der Kunde soll aufhören, arbiträren Schwachsinn zu verlangen.Alternativ sagst du auch einfach, dass du hier keinen Test machen konntest, weil hier zwei sich gegenseitig widersprechenden Forderungen gegeben wurden.
EDIT: Alternativ kannst du die Quellcode-Dateien inkludieren, um an die
struct
s zu kommen. Ist zwar ihhh-bäääh, aber ist ja nur ein Test, wa?
-
Bei struct hast du immer das Problem des Padding.
(manchmal auch FAM (flexible array member), aber das benutzt (zum Glück) kaum jemand, weil es kaum jemand kennt).Um das und somit sämtliches implementierungsabhängiges Verhalten auszuschalten, solltest du das Padding ausschalten, leider geht das nur implementierungsabhängig
mit MSVC (ausnahmsweise mal einfacher)#if _MSC_VER #pragma pack(push,1) #endif #include "structs.h" #if _MSC_VER #pragma pack(pop) #endif
bei gcc musst du wohl oder übel die struct-Definitionen in eine eigene Headerdatei kopieren alá
typedef struct { int bla; char foo[99]; } #if defined(__GNUC__) || defined(__clang__) __attribute__((packed)) #endif Typ;
Und dann mit Zeigern operieren, sämtliche struct-Zeiger sind untereinander zuweisungskompatibel (gemäß C-Standard), bei Dereferenzieren natürlich nicht mehr.