因为尖括号也可以代表(或发生在)比较运算符,<=和>=,宏扩展不能像它括号内确实忽略角括号内的逗号。(对于方括号和大括号,这也是一个问题,即使它们通常作为平衡对出现。)您可以将宏参数括在括号中:
FOO((std::map), map_var);
问题是该参数在宏扩展中保持括号,这可以防止在大多数上下文中将其作为类型读取。
解决此问题的一个很好的技巧是在C ++中,您可以使用函数类型从带括号的类型名称中提取类型名称:
template struct argument_type;
template struct argument_type { typedef U type; };
#define FOO(t,name) argument_type::type name
FOO((std::map), map_var);
因为形成函数类型忽略了额外的括号,所以您可以使用带有或不带括号的宏,其中类型名称不包含逗号:
FOO((int), int_var);
FOO(int, int_var2);
当然,在C语言中,这不是必需的,因为类型名称不能包含括号外的逗号。因此,对于跨语言宏,您可以编写:
#ifdef __cplusplus__
template struct argument_type;
template struct argument_type { typedef U type; };
#define FOO(t,name) argument_type::type name
#else
#define FOO(t,name) t name
#endif