[解決済み】引数の個数でマクロをオーバーロードする方法
2022-04-08 15:59:39
質問
私は2つのマクロを持っています
FOO2
と
FOO3
:
#define FOO2(x,y) ...
#define FOO3(x,y,z) ...
新しいマクロを定義したい
FOO
を次のようにします。
#define FOO(x,y) FOO2(x,y)
#define FOO(x,y,z) FOO3(x,y,z)
しかし、マクロは引数の数でオーバーロードしないので、これはうまくいきません。
を変更することなく
FOO2
と
FOO3
というマクロを定義する方法はありますか?
FOO
(を使用)。
__VA_ARGS__
をディスパッチするのと同じ効果を得ることができます。
FOO(x,y)
を
FOO2
となります。
FOO(x,y,z)
から
FOO3
?
解決方法は?
簡単なことです。
#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__)
つまり、これらのマクロがあれば、記述したとおりに展開されるわけです。
FOO(World, !) // expands to FOO2(World, !)
FOO(foo,bar,baz) // expands to FOO3(foo,bar,baz)
4枚目が欲しい場合
#define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO4, FOO3, FOO2)(__VA_ARGS__)
FOO(a,b,c,d) // expands to FOO4(a,b,c,d)
当然ながら
FOO2
,
FOO3
と
FOO4
の場合、出力は定義されたマクロのものに置き換わります。
関連
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない
-
[解決済み] C/C++ マクロ文字列連結