Forum: Compiler & IDEs ## Operator bei Strings


von COMMAND_SET_VALUE (Gast)


Lesenswert?

Hallo zusammen,

kann man den "Glue" Operator (##) auch auf Strings anwenden?
Bsp.:
1
#define PREFIX            "Sx_"
2
#define COMMAND_ON        "ON"
3
#define COMMAND_OFF       "OFF"
4
#define COMMAND_SET_VALUE "SET"
5
#define POSTFIX           "_xE"
6
7
#define CMD_POWER_ON           PREFIX##COMMAND_ON##POSTFIX
8
#define CMD_POWER_OFF          PREFIX##COMMAND_OFF##POSTFIX
9
#define CMD_SET_VALUE(value)   PREFIX##COMMAND_SET_VALUE##value##POSTFIX

Danke für die Hilfe!

Gruß
Manfred

von Karl H. (kbuchegg)


Lesenswert?

COMMAND_SET_VALUE schrieb:
> Hallo zusammen,
>
> kann man den "Glue" Operator (##) auch auf Strings anwenden?

Du brauchst ihn eigentlich gar nicht.
Denn eine Abfolge von Strings muss vom Compiler sowieso zu einem 
einzigen String zusammengezogen werden.
Also einfach
1
#define PREFIX            "Sx_"
2
#define COMMAND_ON        "ON"
3
#define COMMAND_OFF       "OFF"
4
#define COMMAND_SET_VALUE "SET"
5
#define POSTFIX           "_xE"
6
 
7
#define CMD_POWER_ON         PREFIX COMMAND_ON POSTFIX
8
#define CMD_POWER_OFF        PREFIX COMMAND_OFF POSTFIX
9
#define CMD_SET_VALUE(value) PREFIX COMMAND_SET_VALUE value POSTFIX

CMD_POWER_ON  ist für den Compiler ein einziger String
    "Sx_ON_xE"

Genau das ist zb der Trick, warum man
1
   printf( "Help:  dieses Commando gibt ein\n"
2
           "       Verzeichnis aus\n"
3
           "  Optionen:\n"
4
           "     -r     rekursiv\n"
5
           "     -d     mit Datum\n"
6
           "     -s     ohne Systemdateien\n" );
machen kann. Also einen String auf mehrer Programmzeilen verteilen, so 
dass man im Code sieht, wie die Ausgabe auf der Konsole aussehen wird, 
aber trotzdem keine großartigen Klimmzüge machen muss oder mehrere 
printf benutzen muss. Eine Abfolge von Stringliteralen wird vom Compiler 
automatisch zu einem einzigen String-Literal zusammengezogen.

Bei CMD_SET_VALUE(value) könnte das bei dir zu einem Problem werdenm, 
wenn value kein String Literal ist, aber ansonsten sollte das auch so 
gehen.

Allerdings:
Auf die Art baust du dir eine Menge langer String Literale zusammen. Was 
spricht gegen eine Funktion, die einfach einen String ausgibt und davor 
und dahinter den Prafix bzw. Postfix drann hängt?
1
void SendCommand( const char* cmd )
2
{
3
  sendString( PREFIX );
4
  sendString( cmd );
5
  sendString( POSTFIX );
6
}

von COMMAND_SET_VALUE (Gast)


Lesenswert?

Hi!

Danke für den Hinweis, muss ich gleich mal ausprobieren.

Bzgl. deinem Vorschlag mit dem Senden:
So ähnlich sieht es bei mir auch aus, nur wird bei jedem Senden auch ein 
Zähler inkrementiert, der mitgeschickt wird. Das würde dann nicht mehr 
passen. Gemäß Zähler würden dann 3 Befehle verschickt worden sein, in 
Wirklichkeit aber nur einer. Müsste man dann über einen weiteren 
Parameter abfangen...

von Karl H. (kbuchegg)


Lesenswert?

COMMAND_SET_VALUE schrieb:
> Hi!
>
> Danke für den Hinweis, muss ich gleich mal ausprobieren.
>
> Bzgl. deinem Vorschlag mit dem Senden:
> So ähnlich sieht es bei mir auch aus, nur wird bei jedem Senden auch ein
> Zähler inkrementiert, der mitgeschickt wird. Das würde dann nicht mehr
> passen. Gemäß Zähler würden dann 3 Befehle verschickt worden sein, in
> Wirklichkeit aber nur einer. Müsste man dann über einen weiteren
> Parameter abfangen...

Kann man so sehen.
Man kann es aber auch so sehen, dass das Inkrementieren des Zählers an 
der falschen Stelle im Code sitzt.

void SendCommand( const char* cmd )
{
  sendString( PREFIX );
  sendString( cmd );
  sendString( POSTFIX );

  counter++;
}

Die Funktion sendString kümmert sich dann nicht mehr um den Zähler, 
sondern macht das (und nur das) was aussen drauf steht. Einen (Teil-) 
String versenden. Da ich aber den restlichen Aufbau deines Systems nicht 
kenne, möchte ich mich da jetzt nicht mehr weiter aus dem Fenster 
lehnen.

von COMMAND_SET_VALUE (Gast)


Lesenswert?

Ne geht nicht.
Der Zähler wird im Sendframe mitgeführt.
Der Command der geschickt wird, ist quasi der zu übertragende 
Datenstrom. Da kommt noch das Kommunikationsprotokoll außen herum.

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.