为了账号安全,请及时绑定邮箱和手机立即绑定

C / C ++宏中的逗号

C / C ++宏中的逗号

C++ C
回首忆惘然 2019-08-27 15:43:27
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"


查看完整回答
反对 回复 2019-08-27
?
慕哥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);


查看完整回答
反对 回复 2019-08-27
  • 3 回答
  • 0 关注
  • 1659 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信