Versions-String aus mehreren Teilen erzeugen - concatenation?

Gast #2209170
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?
Gast #2209572
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren