Forum: Mikrocontroller und Digitale Elektronik doppelte definitionen in versch. Übersetzungseinheiten verhindern?


von Nummer 5 lebt! (Gast)


Lesenswert?

Hallo,

ich habe mehrere C files die ich durch parsen einer XML erzeuge.

in diesen C files werden strings definiert, z.B:
1
const __flash uint8 gau8_Text1_de[] = "irgendein Text";

Jetzt kann es aber vorkommen das manche dieser strings in mehreren c 
files definiert werden. Das lässt sich dann zwar noch kompilieren aber 
nicht mehr linken.

das klassische
1
#ifndef IRGENDWAS
2
#define IRGENDWAS
3
...
4
#endif
hilft mir leider nicht weiter das es sich um verschiedene 
Übersetzungseinheiten handelt.

Gibt es irgend etwas was ich machen kann um es trotzdem 
Übersetzungsfähig zu machen?
Sollte der Fall eintreten das die strings aus verschiedenen Datein 
verschiedene Inhalte haben wäre es mir auch egal welcher davon genommen 
wird.

von Stefan E. (sternst)


Lesenswert?

static

von Bernhard R. (barnyhh)


Lesenswert?

Diese Strings gehören in ein Header-File.

Dieses Header-File wird in jede C-Source included. Damit es jetzt nicht 
zu Doppeldefinitionen kommt, macht man folgendes:

Statt
  const __flash uint8 gau8_Text1_de[] = "irgendein Text";
schreibt man
  STRING_TEXT gau8_Text1_de[] = "irgendein Text";
und definiert im main
  #define STRING_TEXT const __flash uint8
in den übrigen Sourcen dagegen
  #define STRING_TEXT extern const __flash uint8

Dann klappt es (hoffentlich).

Bernhard

von Uwe (de0508)


Lesenswert?

Hallo,

ich 'baue' mir die Strings im Flash per MACROs zusammen, und verwende 
eindeutige Namen
1
#define _TEXT_BETRIEBSART_ID(_var)  _var
2
#define TEXT_BETRIEBSART_ID(_id)  _TEXT_BETRIEBSART_ID(TEXT_BETRIEBSART_##_id)
3
4
#define _TEXT_BETRIEBSART(_str,_var)  static const char _var [] PROGMEM = _str
5
#define TEXT_BETRIEBSART(_str,_id)  _TEXT_BETRIEBSART(_str,TEXT_BETRIEBSART_##_id)

Und hier werden die dann expandiert:
1
TEXT_BETRIEBSART("---  ",0);
2
TEXT_BETRIEBSART("LSB  ",1);
3
TEXT_BETRIEBSART("USB  ",2);
4
5
static const char * a_format_betriebsart [] PROGMEM = {
6
TEXT_BETRIEBSART_ID(0),
7
TEXT_BETRIEBSART_ID(1),
8
TEXT_BETRIEBSART_ID(2),
9
};

Die Zeilen laufen auf einem AVR µP und werden mit dem avr-gcc übersetzt.

von Bernhard R. (barnyhh)


Lesenswert?

Mir hat die Zeit fürs Edit nicht gereicht. Deshalb nochmal:

Diese Strings gehören in ein Header-File.

Dieses Header-File wird in jede C-Source included. Damit es jetzt nicht 
zu Doppeldefinitionen kommt, macht man folgendes:

Statt
  const __flash uint8 gau8_Text1_de[] = "irgendein Text";
schreibt man
  STRING_TEXT gau8_Text1_de[] = "irgendein Text";
und definiert im main
  #define STRING_TEXT const __flash uint8
in den übrigen Sourcen dagegen
  #define STRING_TEXT extern const __flash uint8

Dann klappt es (hoffentlich).

Bernhard

edit: Die Initialisierung der externen Variable könnte Probleme liefern, 
deshalb:
  STRING_TEXT gau8_Text1_de[] = "irgendein Text";
wird zu
  STRING_TEXT gau8_Text1_de[] STRING_INIT("irgendein Text");
mit
main:
  #define STRING_INIT(p) = p
Rest:
  #define STRING_INIT(p)

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.