C/C 宏中的逗号
在 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
基于宏的解决方案
或者,您可以定义一个代表逗号的宏:
#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); }
This代码将打印:
std::map
以上是如何处理复杂 C/C 宏参数中的逗号?的详细内容。更多信息请关注PHP中文网其他相关文章!