ホームページ > バックエンド開発 > C++ > C/C マクロのカンマによってマクロの柔軟性と引数の処理がどのように改善されるのでしょうか?

C/C マクロのカンマによってマクロの柔軟性と引数の処理がどのように改善されるのでしょうか?

DDD
リリース: 2024-12-18 15:45:16
オリジナル
562 人が閲覧しました

How Can Commas in C/C   Macros Improve Macro Flexibility and Argument Handling?

C/C マクロのカンマ: 機能の拡張

問題ステートメント:

マクロは次のように定義されています:

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

Thisマクロは変数に typename を割り当てます。ただし、マクロ内で複雑なデータ構造を使用すると、以下に示すように複雑さが生じます。

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

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