単体テスト フレームワークを使用していると、マクロ引数をテストしたい状況に遭遇しました。簡単に言うと、 と となるFOO(x)
ようにマクロを展開したいと思います。FOO(int)
short
FOO(anything_else)
long
もちろん、C++ テンプレートでは、これは問題になりません。しかし、ここでは、単なるtypedef
. すなわちFOO(char) FOO(char) i;
に等しい有効な定義である必要がありますlong long i;
。
単体テスト フレームワークを使用していると、マクロ引数をテストしたい状況に遭遇しました。簡単に言うと、 と となるFOO(x)
ようにマクロを展開したいと思います。FOO(int)
short
FOO(anything_else)
long
もちろん、C++ テンプレートでは、これは問題になりません。しかし、ここでは、単なるtypedef
. すなわちFOO(char) FOO(char) i;
に等しい有効な定義である必要がありますlong long i;
。
私の知る限り、C マクロで使用できる文字列のような操作は、トークンの貼り付け/連結 ( を使用##
) と、トークンの文字列化 ( を使用#
) だけです。
あなたが得ようとしている最も近いものは、次のように可能性を列挙することを含むと確信しています:
#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
この質問からのインスピレーション。
あなたがやろうとしていることは不可能です。
マクロは c プリプロセッサによって評価されます。これは、その名前が示すように、コンパイラが実行される前に実行されます。シンボルのタイプがまだわかりません。
コンパイラによって評価されるときに、自分自身を正しいものにキャストする型のクラスを作成してみませんか。