猿问

C / C ++宏中的逗号

C / C ++宏中的逗号

假设我们有这样的宏

#define FOO(type,name) type name

我们可以使用哪个

FOO(int, int_var);

但并不总是那么简单:

FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2

我们当然可以这样做:

 typedef std::map<int, int> map_int_int_t;
 FOO(map_int_int_t, map_var); // OK

这不是非常符合人体工程学的。必须处理类型不兼容的问题。知道如何用宏来解决这个问题吗?


回首忆惘然
浏览 1660回答 3
3回答

冉冉说

如果你不能使用括号而你不喜欢Mike的SINGLE_ARG解决方案,那么只需定义一个COMMA:#define&nbsp;COMMA&nbsp;,FOO(std::map<int&nbsp;COMMA&nbsp;int>,&nbsp;map_var);如果您想要对某些宏参数进行字符串化,这也会有所帮助,如#include&nbsp;<cstdio>#include&nbsp;<map>#include&nbsp;<typeinfo>#define&nbsp;STRV(...)&nbsp;#__VA_ARGS__#define&nbsp;COMMA&nbsp;,#define&nbsp;FOO(type,&nbsp;bar)&nbsp;bar(STRV(type)&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;has&nbsp;typeid&nbsp;name&nbsp;\"%s\"",&nbsp;typeid(type).name())int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;FOO(std::map<int&nbsp;COMMA&nbsp;int>,&nbsp;std::printf);}打印std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"。

慕哥9229398

如果您的预处理器支持可变参数宏:#define SINGLE_ARG(...) __VA_ARGS__#define FOO(type,name) type nameFOO(SINGLE_ARG(std::map<int, int>), map_var);否则,它有点单调乏味:#define SINGLE_ARG2(A,B) A,B#define SINGLE_ARG3(A,B,C) A,B,C// as many as you'll needFOO(SINGLE_ARG2(std::map<int, int>), map_var);
随时随地看视频慕课网APP
我要回答