使用接受多个参数的宏时可能会遇到困难,特别是当参数包含逗号时。考虑以下示例:
#define FOO(type, name) type name
虽然将宏与以下参数一起使用很简单:
FOO(int, int_var);
处理涉及逗号的复杂参数时会出现问题,例如:
FOO(std::map<int, int>, map_var); // Error: 3 arguments passed to macro 'FOO', which takes only 2
为了解决这个问题,可以引入一种自定义类型定义:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // Compiles successfully
但是,这种方法缺乏人体工程学,并且需要额外的类型转换。
另一种解决方案是定义一个名为 COMMA 的宏:
#define COMMA ,
这样定义中,可以使用 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
以上是如何处理 C/C 中宏参数中的逗号?的详细内容。更多信息请关注PHP中文网其他相关文章!