首页 >后端开发 >C++ >如何在具有多个参数的 C/C 宏中正确处理逗号?

如何在具有多个参数的 C/C 宏中正确处理逗号?

Patricia Arquette
Patricia Arquette原创
2024-12-11 16:19:20320浏览

How Can I Handle Commas Correctly in C/C   Macros with Multiple 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:

typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var); // OK

虽然这种方法有效,但可能很麻烦并引入类型兼容性问题。

另一种解决方案是使用预处理器的 COMMA Macro:

#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);
}

此代码打印:

std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"

通过使用 COMMA 宏,开发人员可以避免 typedef 并确保逗号在宏中正确处理。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn