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这不是非常符合人体工程学的。必须处理类型不兼容的问题。知道如何用宏来解决这个问题吗?
3 回答
冉冉说
TA贡献1877条经验 获得超1个赞
如果你不能使用括号而你不喜欢Mike的SINGLE_ARG解决方案,那么只需定义一个COMMA:
#define COMMA ,FOO(std::map<int COMMA int>, map_var);
如果您想要对某些宏参数进行字符串化,这也会有所帮助,如
#include <cstdio>#include <map>#include <typeinfo>#define STRV(...) #__VA_ARGS__#define COMMA ,#define FOO(type, bar) bar(STRV(type) \ " has typeid name \"%s\"", typeid(type).name())int main(){ FOO(std::map<int COMMA int>, std::printf);}
打印std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
。
慕哥9229398
TA贡献1877条经验 获得超6个赞
如果您的预处理器支持可变参数宏:
#define SINGLE_ARG(...) __VA_ARGS__
#define FOO(type,name) type name
FOO(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 need
FOO(SINGLE_ARG2(std::map<int, int>), map_var);
- 3 回答
- 0 关注
- 1659 浏览
添加回答
举报
0/150
提交
取消