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

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

Linda Hamilton
リリース: 2024-12-11 06:45:09
オリジナル
737 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート