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

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

Patricia Arquette
リリース: 2024-12-04 20:59:13
オリジナル
776 人が閲覧しました

How Can I Handle Commas in C/C   Macros with Multiple Arguments?

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

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