Zentrale Config.h mit verschiedenen Variablen je nach Variante

#4231299
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
#4231310
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.
#4231332
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?
Gast #4231343
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.
#4231427
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
#4231437
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren