Forum: Compiler & IDEs Frage bezügl. optionaler Projekt-Komponenten


von Micha (Gast)


Lesenswert?

Dieser Tage hab ich einem AVR-GCC Projekt die SD-Card Library von Holger 
Klabunde hinzugefügt.
Mein Problem#1: ich hab mich bisher mit C nur in der GUI beschäftigt, um 
die Verwendung von make hab ich mich bisher erfolgreich gedrückt. Bei 
Holger Klabundes Library hatte ich erstmals das Problem am Hals, eine 
Library bestehend aus vielen Dateien irgendwie einzusortieren. Die 
Lösung des Problems hab ich irgendwann begriffen: ich musste zumindest 
alle .c Dateien ins Projekt einbinden damit sie kompiliert werden, also 
in Objekt-Dateien übersetzt werden die der Linker nachher vorliegen 
haben möchte um seine Aerbeit tun zu können.
Mein Problem#2: hauptsächlich zum Zweck des Debugging werden in der 
Holger-Klabunde-Library einige weitere Komponenten (LCD, serielle 
Schnittstelle...) eingebunden, die man nicht unbedingt benötigt sofern 
alles klappt.

Dieses zweite Problem war eigentlich mein Hauptproblem, da ich in meinem 
Projekt bereits andere LCD und serial Bibliotheken drin hatte.

Die Frage die nun im Laufe dieser Experimente für mich aufgetreten ist:
Müssen optionale Komponenten unbedingt vorhanden sein? Mit solchen 
Konstrukten:
#ifdef BLA
 C-Quelltext
#endif

mault mein System, wenn der Code innerhalb der Preprozessor-Bedingung 
nicht vorhanden ist - auch wenn die Bedingung nicht zutrifft.
Gibts irgendwie eine Projekt-Option, dass auf das Vorhandensein von 
nicht einzubindendem Code verzichtet wird?
Wär im Fall der Klabunde Library sehr nützlich, weil ich dann jede Menge 
Quelltext-Dateien die sicher nicht benötigt werden einfach weglassen 
kann.

von Karl H. (kbuchegg)


Lesenswert?

Micha schrieb:

> #ifdef BLA
>  C-Quelltext
> #endif
>
> mault mein System, wenn der Code innerhalb der Preprozessor-Bedingung
> nicht vorhanden ist - auch wenn die Bedingung nicht zutrifft.

Bei einem #ifdef gehts nicht darum, ob eine Bedingung zutrifft oder 
nicht. Es geht darum, ob ein Makro existiert oder nicht.

Wenn du also auf Code stösst
1
#ifdef USE_LCD
2
   lcd_init();
3
#endif

dann suchst du dir die Definition von USE_LCD, die wahrscheinlich in 
irgendeinem Header File steht oder am Anfang der C-Datei.

wenn dort steht
1
#define USE_LCD 1

dann ist die Aktion, die zu einem #ifdef passt, nicht das so zu ändern
1
#define USE_LCD 0

sondern schlicht und ergreifend das Makro auszukommentieren
1
// #define USE_LCD 1

kein makro, der #ifdef schlägt fehl und das was zwischen #ifdef und 
#endif steht, wird nicht mitcompiliert, wenn der Code mittels #ifdef 
geklammert wurde und das Makro nicht existiert.


> Gibts irgendwie eine Projekt-Option, dass auf das Vorhandensein von
> nicht einzubindendem Code verzichtet wird?

Der wird sowieso nicht mitcompiliert.

Allenfalls hat der Autor vielleicht irgendwo einen Fehler gemacht und 
Dinge nicht mittels #ifdef geklammert, weil er zur Kontrolle vor der 
Code-Freigabe das nicht getestet hat. Kommt immer wieder mal vor und ist 
kein Beinbruch: dann ergänzt man halt die #ifdef Klammerung bzw. 
korrigiert den Code entsprechend.
Aus dem Zusammenhang an der betreffenden Codestelle sollte sich 
eigentlich in jedem Fall recht schnell ergeben, wie vorzugehen ist.

> Wär im Fall der Klabunde Library sehr nützlich, weil ich dann jede Menge
> Quelltext-Dateien die sicher nicht benötigt werden einfach weglassen
> kann.

Die lcd-Funktionen bzw. das File in dem die lcd Funktionen (hoffentlich) 
gesammelt sind, schmeisst du dann einfach aus dem Projekt raus. Soviele 
Files werden das schon nicht sein. Der hat ja sicher nicht alle C-Files 
zum Zip File dazugepackt, die er auf seinem Rechner finden konnte.
Als Programmierer muss man auch schon mal ein wenig selbst manuell 
arbeiten. So ist das nun mal. Wenn du das nicht willst, dann musst du 
BWL-er werden. Für die reichts, wenn sie Maus-schubsen können und die 
Nummer von der Hotline parat haben. Aber an einen Software Entwickler 
werden höhere Anforderungen gestellt.


PS: "mault mein System" ist keine sinnvolle Fehlermeldung. Der Compiler 
schreibt wohl kaum "maul" hin. Da steht eine Fehlermeldung, die in 
geschätzten 80% aller Fälle direkt zu einer naheliegenden Korrektur 
führt.

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Hm, du hast deine Probleme doch schon erkannt.
Make ist keine Zauberei. Dazu gibt es Bücher und Anleitungen im Netz. 
Ein ordentlicher Programmierer sollte make schon verstehen.
#ifdef's sind auch keine Zauberei. Dazu gibt es Bücher und Anleitungen 
im Netz. ...

Also eine Runde zurück, die Basics lernen, und sich erst dann an die 
Aufgaben setzen.

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.