首页 > 后端开发 > C++ > 如何处理复杂 C/C 宏参数中的逗号?

如何处理复杂 C/C 宏参数中的逗号?

Linda Hamilton
发布: 2024-12-11 06:45:09
原创
737 人浏览过

How Can I Handle Commas in Complex C/C   Macro Arguments?

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;具有 typeid 名称“St3mapIiiSt4lessIiESaISt4pairIKiiEEE”

以上是如何处理复杂 C/C 宏参数中的逗号?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板