2016-08-28 4 views
-1

私は、テキスト表現の値と16進表現と同じ値を必要とするコードをいくつか持っています。私は両方が必要ですが、エラーの潜在的な原因を取り除くために、値を一度しか指定せず、プリプロセッサに処理させたいと思います。プリプロセッサは引数をスワップします

ここには1つのアイテムの例があります。

int[] v = { 0x01, 0x02 }; 
LPCTSTR s = L"0102"; 

プリプロセッサ連結は、この点で強力な助けとなります。 同じコードですが、今はプリプロセッサコマンドを使用しています。

#define STRING2(x) #x 
#define STRING(x) STRING2(x) 

#define _S(t) _T(STRING2(t)) 
#define _H(t) 0x ## t 

#define _VS(a,b) _S(a) _S(b) 
#define _VH(a,b) _H(a),_H(b) 

LPCTSTR s = _VS(01, 02); 
int[] v = { _VH(01, 02) }; 

preprocesorによって生成されたコードは次のようになります。

int[] v = { 0x01,0x02 }; 
LPCTSTR s = L"01" L"02"; 

しかし、私はまだ私のデータを繰り返しています。だから、私はこれを試してみる。

#define ARGUMENTS 01, 02 

LPCTSTR s = _VS(ARGUMENTS); 
int[] v = { _VH(ARGUMENTS) }; 

これでプリプロセッサコードが壊れています。

int[] v = { 0x01, 02,0x }; 
LPCTSTR s = L"01" L; 

2番目の引数と、それをconcatinatedする必要があるトークン部分が交換されているか、見つからないことに注意してください。しかし、なぜ?

VS2010 help pageは私をあまり助けてくれません。それは、連鎖演算子がマクロ拡張に制約を課していることを私に伝えます。マクロアーチストの拡大が進んでいる理由は、もっともです。 しかし、これをどのように機能させることができますか?

余分なテストは、それがマクロのさらなる拡大を停止するのは間接的な演算子であることを示しました。だから私は最初に議論を展開し、次に連結演算子を使う方法が必要です。良いアイデア?今、方法!

ご提案は大歓迎です。

答えて

1

ARGUMENTSので、まだ単一の値、あなたが明確に両方の出力で見ることです - gccが実際にある(第2 パラメータの治療が続いARGUMENTS単一のパラメータとして扱われ、もっと役立ち、捨て去るerror: macro "_VS" requires 2 arguments, but only 1 givenによる前処理)。

はあなたが望むものを達成するために、これを試してみてください。

#define MK_STRING_INT_PAIR(a,b,sname,vname) \ 
LPCTSTR sname=_VS(a,b); \ 
int[] vname={_VH(a,b)}; 

MK_STRING_INT_PAIR(01,02,s,v) 

[編集] あなたが2つの以上の値が必要な場合は、生成するための短いプログラムを書きます。ライン上のマクロをHファイル:生成されている

#define MK_PAIRS_2(sname,vname,v0,v1) ... 
#define MK_PAIRS_3(sname,vname,v0,v1,v3) ... 

#define MK_PAIRS_128(sname,vname,.... 

、あなたが_VS、_VHヘルパーマクロに

を依存する必要はありません(私はC++ 11で私の骨に感じていますVariadicテンプレートとchar []型のconstexpr-sを使用する可能性がありますが、今のところそれを探索する時間はありません)。

+0

あなたが正しいです、プリプロセッサは交換していません。 「最初の」議論は議論の全体です。それは交換されているようです。 ARGUMENTSが'01,02,03 'に拡張された簡単なテストでは私にそれが分かりました。したがって、このスレッドの正しいタイトルは 'Preprocesor is not parsing arguments'です。 – PapaAtHome

+0

@PapaAtHome "''プリプロセッサは引数を解析していません。 'もちろんそうではありませんでした。 –

+0

あなたのために 'もちろんありません'は私のために起こっている 'ああそれが起こっている'です。あなたの助けを借りて何かを学んだ。ありがとう。 :-) – PapaAtHome

1

あなたの定義をXMacrosと書き換える必要があると感じました。 、

VAL(01) 
VAL(02) 

あなたは、単に適切なマクロを定義して、所望の構造を得るために含めたより:それはこのようなデータ定義を、含まれています(通常は.def拡張子を持つ)一つのファイルを書き込む必要があります気の利いたテクニックですそのような:

#define VAL(x) _H(x), 
    int[] v = { 
    #include "values.def" 
    }; 
#undef VAL 

#define VAL(x) _S(x) 
    LPCTSTR s = 
    #include "values.def" 
    ; 
#undef VAL 
+0

これはどのように動作するのですか。そして、XMacrosについての非常に興味深い記事!このソリューションが多かれ少なかれ「深みのあるもの」である場合、Adrian Colomitchiによって提案された解決策は多かれ少なかれ「息抜き初め」です。どちらのテクニックも使えるようになりました。今使っているものを選ぶことができます。 – PapaAtHome

関連する問題