のパラメータリストを生成するためにマクロを使用する方法:それらのそれぞれのためCマクロは:私は以下のようなコードの行の多くを持っている別のマクロ
sp_setup_point(setup, get_vert(vertex_buffer, i-0, stride));
を、私はI-(抽出することができるようにしたいです0)、それを別の関数に渡します。以下のような:好き
#define GET_VERT(_x, _y, _z) get_vert(_x, _y, _z) , _y
#define SP_SETUP_POINT(_x, _y, _z) sp_setup_point(_x, _y); my_test_func(_z);
とそれらを呼び出す:
SP_SETUP_POINT(setup, GET_VERT(vertex_buffer, i-0, stride));
しかし、それは私が望むものを与えるものではありません、それは次のように拡張されます
sp_setup_point(setup, get_vert(vertex_buffer, i-0, stride));
my_test_func(i-0);
ので、私はマクロ2を書きました
sp_setup_point(setup, get_vert(vertex_buffer, i-0, stride), i-0); my_test_func();
とMSVCコンパイラが
not enough actual parameters for macro 'SP_SETUP_POINT'
Iは、それらがマクロ本体に代入される前に、それらが他のトークンと文字列化または貼り付けられていない限り、マクロ引数は、完全にマクロ展開さhttps://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html
によれば、かなり検索。置換後、置換された引数を含むマクロ本体全体が再度走査され、マクロが展開されます。その結果、引数が2回スキャンされ、マクロ呼び出しが展開されます。
引数は完全に展開されますが、追加の引数は認識されません。それはどうですか?任意の提案は高く評価されます。
ヒント:コンパイラのオプションを使用して、前処理されたソースコードを出力して、式の評価対象を確認します。 – doynax
はい、試しました。私は前処理した後にコードを手に入れましたが、望むマクロ展開を得る方法はまだ分かりません。 – luckyyang