2013-05-16 18 views
8

で2つの、#defineで定義のシンボルの組み合わせ:は私がやりたいC++プリプロセッサ

#define VERSION XY123 
#define PRODUCT MyApplication_VERSION 

することはとてもその製品は、実際にMyApplication_XY123です。私は、マージオペレータで遊んでみました##限られた成功を収めて...

#define VERSION XY123 
#define PRODUCT MyApplication_##VERSION 

=> MyApplication_VERSION

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

=> MyApplication_(XY123)している - は近いがなく、かなり

私は可能なのですか?

+0

中間マクロを試してください。 [これは動作します](http://coliru.stacked-crooked.com/view?id=9a58cc40bae07274adc03c34d119b2ce-2dd64d7c3463c0130a5007ce3cc40567)、おそらくそれを減らすことができます。私は十分にこれを正しく行う方法を覚えておくのに十分なマクロで遊んでいません。 – chris

+0

バージョンを '' XY123 ''として定義できますか? –

+0

@LuchianGrigoreはい役に立った場合 –

答えて

7

トークンの貼り付けは、マクロの引数で動作します。したがって、この

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

コンピュータサイエンスのすべての問題は、間接の余分なレベルでは解決することができます。

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

...あまりにも多くの間接レベルを除いて。 –

+2

@MikeSeymour間接レベルの数がオーバーフローし、0になるまで。 –

3

##オペレータが引数の置換が 行われた前に機能してみてください。古典的な解決策は、ヘルパーを使用することです:

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

CONCAT(MyApplication_, VERSION) 
関連する問題