У меня есть много строк кода, как показано ниже:C макрос: Как использовать макрос для создания списка параметров другого макроса
sp_setup_point(setup, get_vert(vertex_buffer, i-0, stride));
для каждого из них, я хочу, чтобы иметь возможность извлечь (i- 0) и передать его другой функции. как:
sp_setup_point(setup, get_vert(vertex_buffer, i-0, stride));
my_test_func(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), i-0); my_test_func();
и компилятор MSVC жалуются
not enough actual parameters for macro 'SP_SETUP_POINT'
Я искал совсем немного, по https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html
Макро аргументов полностью макро вспененных, прежде чем они подставляются в тело макроса, если они не строковые или вставленные с другими маркерами. После подстановки весь макрос, включая замещенные аргументы, снова сканируется для расширения макросов. В результате аргументы сканируются дважды, чтобы развернуть в них макросы.
аргумент полностью расширен, но дополнительный аргумент не распознается. как это? любое предложение приветствуется.
Подсказка: используйте опцию вашего компилятора, чтобы испускать предварительно обработанный исходный код, чтобы узнать, что оценивает выражение. – doynax
Да, я попробовал. Я получил код после предварительной обработки, но до сих пор не знаю, как получить желаемое расширение макроса. – luckyyang