Forum: Compiler & IDEs makefile soll ausdruck ersetzen


von Elektro G. (e_g)


Lesenswert?

Hallo,
habe da ein Problem:
Habeim makefile (AVR-GCC) die Zeile eingefügt:
MCU=atmega16

Im Sourcecode benutze ich dann folgendes:
uint8_t s[280] = {"\n\rProzessor: " MCU "\n\r"};

nun kommt beim compilieren immer die Fehlermeldung:
error: expected '}' before 'atmega16'

d.h. MCU wird richtig ersetzt, aber warum kommt immer diese 
Fehlermeldung
bzw. wie kann ich es richtig machen?

von Falk (Gast)


Lesenswert?

@ Elektro Gandalf (e_g)

>uint8_t s[280] = {"\n\rProzessor: " MCU "\n\r"};

>nun kommt beim compilieren immer die Fehlermeldung:
>error: expected '}' before 'atmega16'

>d.h. MCU wird richtig ersetzt, aber warum kommt immer diese
>Fehlermeldung
>bzw. wie kann ich es richtig machen?

Ich denke es fehlen zwei Gänsefüsschen.
Etwa so

uint8_t s[280] = {"\n\rProzessor: " "_MCU_" "\n\r"};

Denn ohne würde MCU duch mega16 erstzt, was dann so aussieht

uint8_t s[280] = {"\n\rProzessor: " mega16 "\n\r"};

Das ist aber kein String sondern illegal. So wäre es ein String

uint8_t s[280] = {"\n\rProzessor: " "mega16" "\n\r"};

MfG
Falk

von Klaus F. (kfalser)


Lesenswert?

Versuchs mit

uint8_t s[280] = {"\n\rProzessor: " #_MCU_ "\n\r"};

Der # Operator sollte Anführungszeichen um MCU geben.

Klaus

von Elektro G. (e_g)


Lesenswert?

@Falk:
Hi,

habe ich mir auch schon gedacht, dann wird es aber nicht mehr ersetzt 
;-(

von Elektro G. (e_g)


Lesenswert?

@klaus Falser:

dann kommt folgendes:
error: stray '#' in program
error: expected '}' before 'atmega16'

von Karl H. (kbuchegg)


Lesenswert?

>
> d.h. MCU wird richtig ersetzt, aber warum kommt immer diese
> Fehlermeldung

Weil nach der Ersetzung da steht

uint8_t s[280] = {"\n\rProzessor: " atmega16 "\n\r"};


> bzw. wie kann ich es richtig machen?

Du suchst nach dem 'Stringizer' des Präprozessors

Ohne das jetzt konkret probiert zu haben, muesst das
so gehen
1
#define STR(s) #s
2
uint8_t s[280] = {"\n\rProzessor: " STR(_MCU_) "\n\r"};

von Klaus F. (kfalser)


Lesenswert?

Kommando zurück:
Der # Operator funktioniert nur in Macros.
Entschuldigung, Klaus

von Elektro G. (e_g)


Lesenswert?

@  Karl heinz Buchegger:

funktioniert leider auch nicht, dann steht auch wieder MCU drinnen

von Elektro G. (e_g)


Lesenswert?

OK. mit dem gehts:

#define STR_(a) #a
#define STR(a) STR_(a)



uint8_t s[280] = {"\n\rProzessor: " STR(MCU) "\n\r"};

von Karl H. (kbuchegg)


Lesenswert?

Elektro Gandalf wrote:
> @  Karl heinz Buchegger:
>
> funktioniert leider auch nicht, dann steht auch wieder MCU drinnen

Das ist das Problem mit diesen # und ## Operatoren.
Probiers mal mit einer Makro-Ebene mehr:
1
#define STR2(x) #x
2
#define STR(s) STR2(s)
3
uint8_t s[280] = {"\n\rProzessor: " STR(_MCU_) "\n\r"};

(Nicht lachen: Warum das so ist, kann dir kein Mensch
mit vernüftigen Argumenten erklären. Es hat was mit der
unintuitiven Auswertereihenfolge in Makros zu tun)

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.