C/C マクロのカンマ: 複数のマクロ引数の解決策
C/C のマクロは、プリプロセッサを拡張する便利な方法を提供しますディレクティブをコードのブロックに追加します。ただし、マクロが複数の引数を受け入れる場合、カンマの処理が困難になることがあります。
マクロの例を考えてみましょう:
#define FOO(type,name) type name
このマクロは、型と名前という 2 つの引数を必要とします。単純な場合の使用は簡単です:
FOO(int, int_var);
しかし、テンプレートやコンテナなど型がより複雑な場合、カンマを渡すとエラーが発生する可能性があります:
FOO(std::map<int, int>, map_var); // error
One解決策は、型エイリアスを定義してコンマの必要性を取り除くことです:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var);
ただし、このアプローチは面倒で、問題が発生する可能性があります。型の互換性の問題。
別の解決策は、コンマ マクロを使用してマクロ定義自体内のコンマを処理することです。
#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
std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
カンマ マクロを使用すると、複数の引数を受け入れるマクロを操作する際に、より柔軟でより明確な構文が可能になります。
以上が複数の引数を持つ C/C マクロでカンマを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。