Forum: Mikrocontroller und Digitale Elektronik #Define mit Strings zu verbinden/ketten


von Oliver (Gast)


Lesenswert?

Hallo Gemeinde,

hätte mal eine frage an Euch,

ist es möglich #Define mit Strings zu verbinden/ketten?

sowas:
1
#define MYADR ((const unsigned char *)'x')
2
3
void Bus_puts (unsigned char address, const char *s); // Proto
4
5
int main ( void )
6
{
7
...
8
     Bus_puts ('a', "Meine Adresse ist " MYADR);
9
...
10
}

so dass es zu "Meine Adresse ist x" wird.

Gruß

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Oliver schrieb:

> sowas:


Ja.
Dazu brauchst du noch nicht einmal irgendetwas spezielles tun.
Denn der Compiler muss sowieso aufeinanderfolgende Strings zu einem 
einzigen zusammenfassen
1
#define MYADR "x"
2
3
int main ( void )
4
{
5
....
6
    Bus_puts ('a', "Meine Adresse ist " MYADR);
7
...
8
}

> so dass es zu "Meine Adresse ist x" wird.

genau das wird dann daraus entstehen. Durch die Makrosubstitution 
ensteht
1
    Bus_puts ('a', "Meine Adresse ist " "x" );
und der Compiler muss die beiden Teilstrings (das sie ja direkt 
aufeinander folgen) zu einem einzigen zusammenfassen.

Sollte eigentlich in jedem halbwegs brauchbaren C-Lehrbuch drinn stehen.

von Stefan S. (sschultewolter)


Lesenswert?

#define MYADR "HIER"

bus_puts("Meine Adresse ist " + MYADR);

von B. S. (bestucki)


Lesenswert?

Stefan S. schrieb:
> #define MYADR "HIER"
>
> bus_puts("Meine Adresse ist " + MYADR);

Hier versuchst du zwei Zeiger zu addieren, dies ist jedoch keine 
sinnvolle Operation und der Compiler meckert zu Recht:
1
error: invalid operands to binary + (have ‘const char *’ and ‘const char *’)|


EDIT:
Oliver schrieb:
> #define MYADR ((const unsigned char *)'x')

Das ist übrigens eine ganz dumme Idee. Der Compiler nimmt den 
numerischen Wert von 'x' und macht daraus einen Zeiger. Dieser Zeiger 
zeigt jedoch nicht auf 'x' (zudem auch die nötige Terminierung fehlen 
würde), sondern auf die Speicherstelle 0x78.

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.