mikrocontroller.net

Forum: Compiler & IDEs makefile soll ausdruck ersetzen


Autor: Elektro Gandalf (e_g)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mit

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

Der # Operator sollte Anführungszeichen um MCU geben.

Klaus

Autor: Elektro Gandalf (e_g)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk:
Hi,

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

Autor: Elektro Gandalf (e_g)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@klaus Falser:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#define STR(s) #s
uint8_t s[280] = {"\n\rProzessor: " STR(_MCU_) "\n\r"};

Autor: Klaus Falser (kfalser)
Datum:

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

Autor: Elektro Gandalf (e_g)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger:

funktioniert leider auch nicht, dann steht auch wieder MCU drinnen

Autor: Elektro Gandalf (e_g)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK. mit dem gehts:

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



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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define STR2(x) #x
#define STR(s) STR2(s)
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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.