C/C マクロのカンマ: 機能の拡張
問題ステートメント:
マクロは次のように定義されています:
#define FOO(type, name) type name
Thisマクロは変数に type と name を割り当てます。ただし、マクロ内で複雑なデータ構造を使用すると、以下に示すように複雑さが生じます。
FOO(std::map<int, int>, map_var); // Error: Excess arguments passed to macro
回避策:
回避策の 1 つは、型エイリアスを定義して、式:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // Valid
拡張マクロ構文:
ただし、COMMA マクロを定義するという、より効率的で人間工学に基づいた解決策があります。引数リストからカンマ演算子を分離することで、複雑な式を元の FOO マクロに渡すことが可能になります:
#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 マクロを使用すると、マクロの表現力と柔軟性が大幅に向上し、より複雑なデータ型の処理やマクロ引数の文字列化が可能になります。
以上がC/C マクロのカンマによってマクロの柔軟性と引数の処理がどのように改善されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。