2013-05-16 11 views
8

che voglio fare:La combinazione di due simboli #defined in C++ preprocessore

#define VERSION XY123 
#define PRODUCT MyApplication_VERSION 

in modo che il prodotto è in realtà MyApplication_XY123. Ho provato a giocare con l'operatore di unione ##, ma con scarso successo ...

#define VERSION XY123 
#define PRODUCT MyApplication_##VERSION 

=> MyApplication_VERSION

#define VERSION XY123 
#define PRODUCT MyApplication_##(VERSION) 

=> MyApplication_ (XY123) - vicino ma non abbastanza

Is cosa voglio possibile?

+0

Provare una macro intermittente. [Questo funziona] (http://coliru.stacked-crooked.com/view?id=9a58cc40bae07274adc03c34d119b2ce-2dd64d7c3463c0130a5007ce3cc40567), ma probabilmente puoi abbatterlo. Non gioco abbastanza con i macro per ricordare come farlo correttamente. – chris

+0

Puoi definire la versione come '" XY123 "'? –

+0

@LuchianGrigore yes se aiuta –

risposta

7

incollare provvisoria funziona con gli argomenti a macro. Quindi provare questo

#define VERSION XY123 
#define PASTE(x) MyApplication_ ## x 
#define PRODUCT PASTE(VERSION) 
1

Tutti i problemi in informatica possono essere risolti con un ulteriore livello di indirezione:

#define JOIN_(X,Y) X##Y 
#define JOIN(X,Y) JOIN_(X,Y) 
#define VERSION XY123 
#define PRODUCT JOIN(MyApplication_,VERSION) 
+3

... eccetto per troppi livelli di riferimento indiretto. –

+2

@MikeSeymour fino a quando non si supera il numero di livelli di riferimento indiretto e si passa a 0. –

3

L'operatore agisce ##prima argomento sostituzione ha avuto luogo . La soluzione classica consiste nell'utilizzare un helper:

#define CONCAT2(a, b) a ## b 
#define CONCAT(a, b) CONCAT2(a, b) 

CONCAT(MyApplication_, VERSION)