假设我们有一个像这样的宏
#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
这不是很符合人体工程学。必须处理 Plus 类型的不兼容性。知道如何用宏解决这个问题吗?
最佳答案
如果您不能使用括号并且不喜欢 Mike 的 SINGLE_ARG 解决方案,只需定义一个逗号:
#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"
.
关于c++ - C/C++ 宏中的逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842468/