C/C マクロのカンマ
C/C マクロでは、多くの場合、複数の引数をカンマで区切る必要があります。ただし、マクロが特定の数の引数を予期している場合に問題が発生し、多かれ少なかれ指定するとエラーが発生します。
問題のシナリオ
次のように定義されたマクロを考えてみましょう:
#define FOO(type, name) type name
このマクロは簡単に使用できますが、例:
FOO(int, int_var);
複雑な型が関与すると問題が発生します:
FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
従来の解決策
1 つの一般的なアプローチは、新しいタイプのエイリアスを作成し、それをマクロ:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // OK
マクロベースのソリューション
または、コンマを表すマクロを定義できます:
#define COMMA ,
このマクロを使用を使用せずに複合型を渡すことができるようになりました。エラー:
FOO(std::map<int COMMA int>, map_var);
追加の使用例
このアプローチは、以下に示すように、マクロ引数を文字列化するときにも役立ちます。
#include <cstdio> #include <map> #include <typeinfo> #define STRV(...) #__VA_ARGS__ #define COMMA , #define FOO(type, bar) bar(STRV(type) \ " has typeid name \"%s\"", typeid(type).name()) int main() { FOO(std::map<int COMMA int>, std::printf); }
Thisコードは次のように出力されます:
std::map
以上が複雑な C/C マクロ引数内のカンマを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。