私は、テキスト表現の値と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は私をあまり助けてくれません。それは、連鎖演算子がマクロ拡張に制約を課していることを私に伝えます。マクロアーチストの拡大が進んでいる理由は、もっともです。 しかし、これをどのように機能させることができますか?
余分なテストは、それがマクロのさらなる拡大を停止するのは間接的な演算子であることを示しました。だから私は最初に議論を展開し、次に連結演算子を使う方法が必要です。良いアイデア?今、方法!
ご提案は大歓迎です。
あなたが正しいです、プリプロセッサは交換していません。 「最初の」議論は議論の全体です。それは交換されているようです。 ARGUMENTSが'01,02,03 'に拡張された簡単なテストでは私にそれが分かりました。したがって、このスレッドの正しいタイトルは 'Preprocesor is not parsing arguments'です。 – PapaAtHome
@PapaAtHome "''プリプロセッサは引数を解析していません。 'もちろんそうではありませんでした。 –
あなたのために 'もちろんありません'は私のために起こっている 'ああそれが起こっている'です。あなたの助けを借りて何かを学んだ。ありがとう。 :-) – PapaAtHome