ホームページ >バックエンド開発 >C++ >複雑な C/C マクロ引数内のカンマを処理するにはどうすればよいですか?

複雑な C/C マクロ引数内のカンマを処理するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-11 06:45:09736ブラウズ

How Can I Handle Commas in Complex C/C   Macro Arguments?

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 typeid 名は「St3mapIiiSt4lessIiESaISt4pairIKiiEEE」です

以上が複雑な C/C マクロ引数内のカンマを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。