Forum: Compiler & IDEs Versions-String aus mehreren Teilen erzeugen - concatenation?


von gcc_fan (Gast)


Lesenswert?

Hallo!

ich versuch gerade rauszukriegen, wie man einen String im Präprozessor 
zusammensetzt.

Dabei soll so ein String hier rauskommen: "Software-Version 1.23"

und besteht aus diesen Teilen:

- zusammengestzter string befindet sich in einem #define, z.B. so:
1
#define _SW_STR_ "Software-Version 1.23"

- Einzelbestandeteile der Versionsnummer sind in einem #define:
1
#define _VMSTR_  Software-Version
2
#define _FOO_ 1
3
#define _BAR_ .123

Ich dachte da jetzt an so etwas:
1
#define CONCATEN( x,y,z )    x ## y ## z
2
#define REPLCONC( a,b,c )    CONCATEN( a, b, c )
3
4
#define _SW_STR_ REPLCONC( _FOO_, _BAR_, _VMINOR_ )
5
6
7
char string_ptr[]= #_SW_STR_;

Das REPLCONC() sorgt dafür, dass der Inhalt von _FOO_ ( also 1) 
verwendet wird - und nicht nur der Token (_FOO_).

Aber so funktioniert das leider noch nicht :(
in string_ptr steht danach der String "x ## y ## z"

Kennt da jemand eine elegante Möglichkeit um soetwas zu generieren?

von homer (Gast)


Lesenswert?

also falls Du statt x ## y ## z einfach x##y##z schreibst geht's einfach 
mit dem gcc ...

von DirkB (Gast)


Lesenswert?

1
#define CONCATEN( x,y,z )    #x " " #y  #z
2
....
3
char string_ptr[]= _SW_STR_;

von Jasch (Gast)


Lesenswert?

gcc_fan schrieb:
> Hallo!
>
> ich versuch gerade rauszukriegen, wie man einen String im Präprozessor
> zusammensetzt.
>
> Dabei soll so ein String hier rauskommen: "Software-Version 1.23"
>
> und besteht aus diesen Teilen:
>
> - zusammengestzter string befindet sich in einem #define, z.B. so:
>
1
> #define _SW_STR_ "Software-Version 1.23"
2
>
>
> - Einzelbestandeteile der Versionsnummer sind in einem #define:
>
1
> #define _VMSTR_  Software-Version
2
> #define _FOO_ 1
3
> #define _BAR_ .123
4
>
>
> Ich dachte da jetzt an so etwas:
>
>
1
> #define CONCATEN( x,y,z )    x ## y ## z
2
> #define REPLCONC( a,b,c )    CONCATEN( a, b, c )
3
> 
4
> #define _SW_STR_ REPLCONC( _FOO_, _BAR_, _VMINOR_ )
5
> 
6
> 
7
> char string_ptr[]= #_SW_STR_;
8
>

Warum so kompiliziert?

#define VMSTR  "Software-Version"
#define FOO "1"
#define BAR ".123"

char string_ptr[]= VMSTR " " FOO_ _BAR;

Sollte tun was Du willst, modulo dem extra define SW_STR. Symbole mit 
führendem Unterstrich sind aber meines Wissens für C reserviert.

von gcc_fan (Gast)


Lesenswert?

@homer

damit hatte ich leider das gleiche Ergebnis :(

@DirkB

so hat's geklappt!

@Jasch

VMSTR " " FOO_ _BAR ... klappt auch!


Vielen Dank an Euch alle!

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.