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

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

Linda Hamilton
リリース: 2024-12-17 06:29:25
オリジナル
917 人が閲覧しました

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

C/C のマクロ内のカンマ

複数の引数を受け入れるマクロを使用するとき、特に引数にカンマが含まれている場合に問題が発生することがあります。次の例を考えてみましょう。

#define FOO(type, name) type name
ログイン後にコピー

次のような引数を指定してマクロを使用するのは簡単ですが、

FOO(int, int_var);
ログイン後にコピー

のようなコンマを含む複雑な引数を扱う場合には問題が発生します。 >

FOO(std::map<int, int>, map_var); // Error: 3 arguments passed to macro 'FOO', which takes only 2
ログイン後にコピー
これに対処するには、カスタム タイプを導入することができます。定義:

typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var); // Compiles successfully
ログイン後にコピー
ただし、このアプローチには人間工学が欠けており、追加の型変換が必要です。

代替ソリューションには、COMMA という名前のマクロを定義することが含まれます:

#define COMMA ,
ログイン後にコピー
これを使用定義では、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);
}
ログイン後にコピー
このコードは次のように出力します。 typeid 名は「St3mapIiiSt4lessIiESaISt4pairIKiiEEE」です。"

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

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