Forum: Compiler & IDEs Zentrale Config.h mit verschiedenen Variablen je nach Variante


von Schotter (schottre)


Lesenswert?

Hi,

im Grunde genommen brauche ich nur ein definitives Nein bzw. einen 
Workaround. Ich habe eine config.h
1
int alarm_lvl = 5;
2
char version[] = "version1";

die von alarm.c und service.c inkludiert werden. alarm.c braucht von 
config.h den alarm_lvl und service.c den Versionsstring. Jetzt gibt es 
schon diesen schönen Artikel

http://www.mikrocontroller.net/articles/FAQ#Globale_Variablen_.C3.BCber_mehrere_Dateien

der meine Frage verneint, aber da ich trotzdem gerne nur eine Datei 
hätte die, die Konfiguration enthält, lacht mich (und sicherlich viele 
andere auch) dieser Versuch an.

Kennt da jmd einen halbwegs schönen Workaround?

Grüße,
Thorsten

von Walter T. (nicolas)


Lesenswert?

Thorsten S. schrieb:
> der meine Frage verneint,

Welche Frage? Ist das die Frage:

Thorsten S. schrieb:
> Kennt da jmd einen halbwegs schönen Workaround?

Wenn ja - ja, ich kenne schöne und weniger schöne Workarounds. Zu 
unterschiedlichen Problemen.

Wenn Du Konstante Strings/Variablen definieren willst: Mach doch einfach 
#DEFINE VERSION "Version 1.1.0" in Deine Header-Datei.

Oder noch besser: Laß die Versionsbezeichnungen automatischon von Deinem 
Versionsverwaltungssystem erzeugen.

Viele Grüße
W.T.

von Karl H. (kbuchegg)


Lesenswert?

Thorsten S. schrieb:

> Kennt da jmd einen halbwegs schönen Workaround?

Einen Workaround wofür?

Ev. suchst du ja eine Möglichkeit, wie du den Präprozessor für dich 
einspannen kannst.
1
#ifdef CONFIG_1
2
3
int alarm_lvl = 5;
4
char version[] = "version1";
5
6
#endif
7
8
#ifdef CONFIG_2
9
10
int alarm_lvl = 8;
11
char version[] = "version1";
12
13
#endif

du definierst dann zb im Makefile welche Konfiguration du haben willst, 
indem du ein entsprechendes define beim Compileraufruf mitgibst.

eventuell kommst du mit Präproprozessor 'Variablen' und entsprechenden 
#if #elif #endif weiter.


Was ist das Problem?

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

Karl H. schrieb:
> Was ist das Problem?

Variablen Definitionen in Header-Datei?

von W.S. (Gast)


Lesenswert?

Thorsten S. schrieb:
> im Grunde genommen brauche ich nur ein definitives Nein bzw. einen
> Workaround. Ich habe eine config.h
> int alarm_lvl = 5;
> char version[] = "version1";

NEIN. Definitiv.

Erstens solltest du keine Variablendeklarationen in irgendeiner .h tun.

Zweitens sollte in einer .h grundsätzlich nur genau DAS drinstehen, was 
andere Module vom betreffenden Modul wissen müssen, um mit diesem 
Modul richtig umgehen zu können. UND NICHT MEHR.

Drittens ziehe nicht immer alles zusammen. "int alarm_lvl = 5;" sollte 
vermieden werden. Stattdessen initialisiere dein alarm_lvl in irgend 
einer Initialisier-Prozedur, die du zu gegebener Zeit am Programmstart 
und ggf. nach irgendwelchen Zuständen deines systems aufrufst. 
Billigstenfalls per "SetAlarmLevel(5);" - du hast ja vermutlich nicht 
ohne Grund eine Variable eingeführt.

Gehe mal etwas in dich und überlege dir deine Modul-Aufteilung nochmal 
gründlich.

W.S.

von Schotter (schottre)


Lesenswert?

Danke für die Antworten. Was ich letztlich will lässt sich 
folgendermaßen umsetzen.

config.h
1
//#define KUNDE1
2
#define KUNDE2
3
4
extern int alarm_lvl;
5
extern char version[];

config.c
1
#include "config.h"
2
3
#ifdef KUNDE1
4
int alarm_lvl = 17;
5
char version[] = "version2";
6
#endif
7
8
#ifdef KUNDE2
9
int alarm_lvl = 5;
10
char version[] = "version1";
11
#endif

von Volker S. (vloki)


Lesenswert?

Warum so kompliziert, wenn du die Variablen immer nur in einer Datei 
brauchst?
Walter T. hatte bestimmt eher so was im Sinn:

config.h
1
#ifdef KUNDE1
2
  #define ALARM 17
3
  #define VERSION "version 1"
4
#elif defined KUNDE2
5
  #define ALARM 5
6
  #define VERSION "version 2"
7
#endif

alarm.c
1
#include "config.h"
2
3
int alarm_lvl = ALARM;
service.c
1
#include "config.h"
2
3
char version[] = VERSION;

: Bearbeitet durch User
von Schotter (schottre)


Lesenswert?

@Volker
Vielen Dank, deine Variante gefällt mir wesentlich besser! Bei meiner 
bin ich an globale Variablen gebunden, mit deiner kann ich auch lokale 
entsprechend setzen.

von Dennis S. (eltio)


Lesenswert?

W.S. schrieb:
> Erstens solltest du keine Variablendeklarationen in irgendeiner .h tun.
Das halte ich ja mal für ein Gerücht... oder warum sollte man das nicht 
tun?

Gruß
Dennis

von Dirk B. (dirkb2)


Lesenswert?

W.S. schrieb:
> Erstens solltest du keine Variablendeklarationen in irgendeiner .h tun.

Gerade die Deklarationen gehören da rein.
Die Definitionen dagegen nicht.

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.