mikrocontroller.net

Forum: Compiler & IDEs Frage zu includes und defines


Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die relevanten Defines im Makefile angeben ...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Seegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.