SEにはいくつかの質問と回答があります可変長マクロに渡される実引数の数のカウントを処理します。この問題には標準的な解決策があるようで、そのバリエーションは回答で繰り返されます。
私の質問は、リスト内の特定の引数を(安全な方法で)参照できるかどうかです。たとえば、マクロが次のように定義されている場合:
#define MACRO(...) { some code involving __VA_ARGS__ }
リストの2番目の引数を参照する方法はありますか(例: __VA_ARG_1__
)、実際に合格したことがわかっていると仮定すると?合格したかどうかわからない場合はどうなりますか?
回答:
回答№1の場合は3あなたはこれを試すことができます:
#define GET_SECOND(x, y, ...) (y)
#define MACRO(...) { some_code_using(GET_SECOND(__VA_ARGS__)); }
起動すると、適切なエラーメッセージが表示されます MACRO
引数が少なすぎます。
回答№2の場合は0
任意の引数を取得するには、非常に恐ろしい答えがここに含まれています:
http://p99.gforge.inria.fr/p99-html/p99__list_8h.html
私の(確かに非専門家)の理解から関数型プログラミングとプログラミング言語理論では、Haskell、OCamlなどで行われているように、プリプロセッサで再帰とパターンマッチングを行い、N個の要素を剥ぎ取り、リストの接尾辞を破棄します。結果。