假设我们有一个这样的宏
#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 类型的不兼容性。知道如何用宏解决这个问题吗?
原文由 PoP 发布,翻译遵循 CC BY-SA 4.0 许可协议
Because angle brackets can also represent (or occur in) the comparison operators
<
,>
,<=
and>=
, macro expansion can’ t 忽略尖括号内的逗号,就像在括号内一样。 (这也是方括号和大括号的问题,即使它们通常作为平衡对出现。)您可以将宏参数括在括号中:问题是该参数在宏扩展内保持括号括起来,这会阻止它在大多数情况下被读取为类型。
解决此问题的一个好技巧是,在 C++ 中,您可以使用函数类型从带括号的类型名称中提取类型名称:
因为形成函数类型会忽略额外的括号,所以您可以在类型名称不包含逗号的情况下使用带或不带括号的宏:
当然,在 C 中,这不是必需的,因为类型名称不能包含括号外的逗号。因此,对于跨语言宏,您可以编写: