2012-06-19 5 views
6

ユニットテストフレームワークを使って、マクロ引数をテストしたいという状況に遭遇しました。簡単に言えば、がshortFOO(anything_else)longとなるようにマクロFOO(x)を展開したいと思います。プリプロセッサ引数を条件付きで置き換えることはできますか?

C++テンプレートでは、もちろんこれは問題ではありません。しかしここで私は実際のトークンの交換が必要です。typedefだけではありません。私。 FOO(char) FOO(char) i;long long i;に等しい有効な定義である必要があります。

+1

最新のC標準には、マクロの置換テキストが最初の引数の式の型に依存する機能があります。これをビルディングブロックとして使用できます。 –

+0

あなたはboost.ppを見ましたか?それと一緒にsomethignをハックすることができますか? – PlasmaHH

+1

@StefanMajewsky:私はジェネリックスを信じていますか? – dirkgently

答えて

0

あなたがしようとしていることは不可能です。

マクロは、プリプロセッサによって評価されます。これは、コンパイラが実行される前に実行されることを暗に意味します。あなたのシンボルのタイプがまだ何であるかはわかりません。

コンパイラによって評価された時点で正しいものにキャストする型のクラスを作成しないのはなぜですか。

+0

私はタイプについて気にしない。私は前処理段階の 'int'は単なるトークンであることを知っています。それでも、私は条件付きでトークンintで動作したい。 – MSalters

3

私の知る限り、Cマクロで利用できる唯一の文字列のような操作は、トークンの貼り付け/連結(##を使用)と文字列化(#を使用)です。

私は、あなたが取得するつもりだ最も近いがそうのような可能性を列挙する必要とするかなり確信している:this questionから

#define FOO(x) FOO__##x 
#define FOO__int short 
#define FOO__short long 
#define FOO__long long 
#define FOO__char long 
// ... for each type you want to replace 

インスピレーションを。

+0

(編集#2):「elses」の限定された既知のセットがある場合は、それらをすべてリストすることができます。 – flolo

+0

ええ、私は今それを実現し、全体の投稿をきれいにしました。 – vergenzt

+0

私は自分の議論を列挙できるとは思わない。私は 'FOO(AcmeWidgetUnitTest17)'を得るかもしれない:( – MSalters

関連する問題