我有很多行代码像下面的参数列表: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