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?
@ 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
Versuchs mit uint8_t s[280] = {"\n\rProzessor: " #_MCU_ "\n\r"}; Der # Operator sollte Anführungszeichen um MCU geben. Klaus
@Falk: Hi, habe ich mir auch schon gedacht, dann wird es aber nicht mehr ersetzt ;-(
@klaus Falser: dann kommt folgendes: error: stray '#' in program error: expected '}' before 'atmega16'
> > 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"}; |
Kommando zurück: Der # Operator funktioniert nur in Macros. Entschuldigung, Klaus
@ Karl heinz Buchegger: funktioniert leider auch nicht, dann steht auch wieder MCU drinnen
OK. mit dem gehts: #define STR_(a) #a #define STR(a) STR_(a) uint8_t s[280] = {"\n\rProzessor: " STR(MCU) "\n\r"};
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.