Forum: Compiler & IDEs Frage zu includes und defines


von dennis (Gast)


Lesenswert?

Hi,
ich steh hier grad vor nem kleinen Problem. Ich will's mal kurz
beschreiben.

Ich habe 4 Dateien, main.c, main.h, lib.c und lib.h.

In main.c werden die beiden .h Files mit #include importiert. Soweit
noch alles klar.

Jetzt möchte ich aber die Lib so gestalten das man per #define
unterschiedliche Sachen compilieren kann. Das könnte ich natürlich in
der lib.h machen, aber da habe ich das Problem das ich das für jede
Applikation u.U. anpassen muß. D.h. ich möchte die bedingte
Compilierung in das eigentliche Projekt packen ohne an der Lib was
ändern zu müssen. Ich möchte die Lib Files auch nur ungern in jeden
Projektordner kopieren. Wenn man an der Lib was ändert muß man alle
Kopien durchgehen und darf keine Fehler machen.

Am liebsten wäre es mir wenn man die Defines für die Lib in der Datei
main.h machen könnte, aber der Lib ist die Datei ja nicht bekannt.

Ich nehme mal an die einzige Möglichkeit ist es diese Defines ins
Makefile oder in die Kommandozeile zu packen, aber wie geht das? Oder
gibt es noch einen anderen Weg?

Schonmal danke
dennis

von Jens D. (Gast)


Lesenswert?

importiere die main.h doch in deine lib.h ;)

oder setz die defines in der main.c und importiere dann die lib.h

gruss

von dennis (Gast)


Lesenswert?

wow, schnelle Antwort, danke.

Das mit dem Import von main.h in die lib.h geht nicht weil ich damit
schon wieder die lib selbst ändere. Das will ich ja grad vermeiden.

Die Defines vor dem Import könnte gehen.

dennis

von dennis (Gast)


Lesenswert?

hm, funktioniert leider doch nicht. Wenn ich in main.c ein Define anlege
ist das Define nur in der lib.h bekannt, aber nicht in lib.c

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die relevanten Defines im Makefile angeben ...

von Karl H. (kbuchegg)


Lesenswert?

Du kannst das wie folgt machen.

Deine Lib.h haengt von ein paar #define-ments ab, die
defineirt werden muessen, bevor Lib.h copmiliert
wird. Also zb.

Lib.h
*****

#ifdef USE_PI
#define PI 3.141592654
#endif

#ifdef USE_IRGENDWAS
void Irgendwas( void );
#endif

In Der main.c, dort wo Du die Lib.h inkludierst, definierst
Du dann ganz einfach all das was Du von der Lib.h haben
moechtest:

main.c
******

#define USE_PI
/* #define USE_IRGENDWAS */    /* die will ich nicht */
#include "Lib.h"

int main()
{
  double j = PI;  /* geht, da ueber USE_PI in Lib.h ja eine
                     Definition fuer PI angefordert wurde */


Auch wenn normalerweise die #define-s das erste in einer
Datei sind, muss das nicht so sein. #define kann ueberall
stehen, und Du kannst davor machen was auch immer Du willst.

von Karl H. (kbuchegg)


Lesenswert?

Muss nactuerlich heissen:
Auch wenn die #includes-s das erste ...
#include kann ueberall ....


Verdamm... wieso merkt man sowas immer erst in der Sekunde
in der man auf 'Submit' gedrueckt hat?

von Stefan Seegel (Gast)


Lesenswert?

Hallo,

ähnliches Problem hatte ich auch mal, ich hatte ein Modul, dass von
mehreren Projekten benutzt wurde, und schließlich auch unterschiedliche
Hardwareversionen eines Projektes.
Man kann in das makefile defines einbinden, so z.B.:

HWVERSIONMAJOR = 2
HWVERSIONMINOR = 0

CDEFS += -DHWVERSIONMAJOR=$(HWVERSIONMAJOR)
CDEFS += -DHWVERSIONMINOR=$(HWVERSIONMINOR)

Im Sourcecode habe ich dann

#if (HWVERSIONMAJOR == 2)
blabla
#endif

#if (HWVERSIONMAJOR == 3)
blabla
#endif

Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.