c++ - C/C++ 宏中的逗号

标签 c++ c macros c-preprocessor

假设我们有一个像这样的宏

#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

这不是很符合人体工程学。必须处理 Plus 类型的不兼容性。知道如何用宏解决这个问题吗?

最佳答案

如果您不能使用括号并且不喜欢 Mike 的 SINGLE_ARG 解决方案,只需定义一个逗号:

#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" .

关于c++ - C/C++ 宏中的逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842468/

相关文章:

c - 查找编译时宏下的函数/宏调用次数

c++ - boost::unordered_map 可以与 std::shared_ptr 一起使用吗?

c++ - Boost Enum 256 元素限制

c++ - 将整数、短裤和字符映射到位模式

c - 为什么我在哈希表中得到相同的值?

c - 如何降低以下循环的时间复杂度?

c++ - 如何获得一个 vector 以接收具有相同基类的 2 个不同类?

c++ - libvlc_media_player_get_time 返回零

c++ - 使用 C++ 宏查找/替换?

c - C中不同宏函数/内联方法的优缺点