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
この問題を解決するには、typedef を導入することが 1 つのオプションです。
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // OK
このアプローチは機能しますが、面倒で型の互換性の問題が発生する可能性があります。
別の解決策は、プリプロセッサの COMMA を使用することですマクロ:
#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); }
このコードは次のように出力します:
std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
COMMA マクロを利用することで、開発者は typedef を回避し、カンマがマクロで正しく処理されます。
以上が複数の引数を持つ C/C マクロでカンマを正しく処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。