Forum: Compiler & IDEs ANSI C - Softwareschalter definieren


von entwickler (Gast)


Lesenswert?

Guten Morgen,

ich benötige für meine Applikationen einen Softwareschalter. Dazu habe 
ich eine Headerdatei erzeugt. In dieser Datei soll der Schalter 
definiert sein. Ich habe insgesamt zwei Boards. Diese möchte ich in 
dieser Datei mit einem #if defined aktiveren. Wie kann man sowas in ANSi 
C realisieren ?

von Sven P. (Gast)


Lesenswert?

entwickler schrieb:
> einen Softwareschalter
Was ist das?

Präzprozessordirektiven gibt es bei Google und in praktisch jedem 
C-Buch.

von Peter D. (peda)


Lesenswert?

entwickler schrieb:
> Wie kann man sowas in ANSi
> C realisieren ?

Soll Dir jetzt jemand aus einem C-Buch vorlesen oder für Dich googlen?


Peter

von entwickler (Gast)


Lesenswert?

TargetBoard.h:
1
#ifndef __TargetBoard
2
#define __TargetBoard
3
4
//#define BOARD1_USED
5
#define BOARD2_USED
6
7
#endif

Diese defines werden dann in den entsprechenden C Files angewendet.
1
#include "targetBoard.h"
2
3
#if defined (BOARD1_USED)
4
 // Einstellungen für Board 1
5
#elif defined (BOARD2_USED)
6
 // Einstellungen für Board 2
7
#endif

Gibt es eine bessere Alternative ?

von Z. R. (Firma: rzr) (zracz)


Lesenswert?

entwickler schrieb:
> Gibt es eine bessere Alternative ?

Nein, das ist der übliche Weg. Funktioniert problemlos.

von Tom M. (Gast)


Lesenswert?

entwickler schrieb:
> Gibt es eine bessere Alternative ?

Steuern via Makefile bzw. defines direkt dem Compiler übergeben?

gcc -DBOARD1 -Wall -.....
gcc -DBOARD2 -Wall -.....

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Es gibt auch die Möglichkeit, die Quelle nicht mit #ifdefs zu übersäen:

Die unterschiedlichen Funktion(alität)en pro Board / Variante werden in 
ein eigenes Modul ausgelagert, das je nach Build-Variante hinzugelinkt 
wird:
1
LD = avr-gcc -mmcu=atmega123
2
3
variante1.elf: modul1.o main.o
4
  $(LD) $(LDFLAGS) $^ -o $@ 
5
6
variante2.elf: modul2.o main.o
7
  $(LD) $(LDFLAGS) $^ -o $@

von Fabian O. (xfr)


Lesenswert?

Ich würde je Modul eine eigene Config-Headerdatei einbinden und dort 
ggf. die Fallunterscheidung machen. Dann kann man den Modulcode 
unabhängig von den Boardeinstellungen pflegen/weitergeben/aktualisieren.

Beispiel:
1
// uart_config.h
2
3
#include "targetBoard.h"
4
5
#if defined (BOARD1_USED)
6
 // Einstellungen für Board 1
7
#elif defined (BOARD2_USED)
8
 // Einstellungen für Board 2
9
#endif
1
// uart.c
2
3
#include "uart_config.h"
4
5
// Code

Wenn Du die uart.c jemand anderem zur Verfügung stellst, kann er sie 
ohne Änderungen in sein Projekt aufnehmen, er muss ggf. nur 
uart_config.h auf seinen eigenen Auswahlmechanismus ändern:
- Er kann Einstellungen für seine eigenen Boards ergänzen.
- targetBoard.h darf anders heißen.
- Das Board kann alternativ per Compileroption definiert werden.
- Er nutzt für jedes Projekt eine eigene uart_config.h bzw. inkludiert 
darin eine, die nur die Einstellungen des richtigen Boards enthält.
- Er inkludiert eine globale config.h.
- ...

Andernfalls müsste er für alle diese Änderungen uart.c ändern. Wenn Du 
ihm später eine neue Version von uart.c gibst, müsste er darin die 
Änderungen jedes mal wieder nachziehen. Wenn die Einstellungen vom Code 
getrennt sind, kann man uart.c dagegen einfach austauschen, solange 
keine neuen Einstellungen ohne Defaultwert dazu kommen.

von hnun (Gast)


Lesenswert?

>Gibt es eine bessere Alternative ?

Ja. Wenn die Funktionalitäten der beiden Boards sich nicht zu stark 
unterscheiden und sonst nichts dagegenspricht, würde ich die Abfrage
zur Laufzeit machen, um nur mit einem identischen Image hantieren
zu müssen.

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.