C ++预处理程序宏循环__VA_ARGS__ 1 vs 2+自变量

多昌

我使用这个宏通过我的论点循环。一切正常!但是,有没有一种方法可以将两者CCB_CREATE结合起来CCB_CREATE_MORE

我需要提取第一个参数object_type来编写其他代码。其他object_types将使用FOR_EACH循环插入到地图中。

当我使用时只有一个参数时,编译器会抱怨CCB_CREATE_MORE(Type1)为了解决这个问题,我制作了另一个宏来处理该问题CCB_CREATE(Type1)希望找到一个巧妙的解决方案,将两者结合成一个优雅的宏。有任何想法吗?

#define INSERT_LOADER_MAP(object_type) loader_map.insert(make_pair(#object_type, object_type##Loader::loader()))


#define CCB_CREATE_MORE(object_type,...) \
static CCNode * create##object_type##Node() { \
    std::map<std::string, CCNodeLoader*> loader_map; \
    std::string classname = #object_type; \
    FOR_EACH(INSERT_LOADER_MAP,object_type,__VA_ARGS__); \
    return loadCCBFile((classname + ".ccbi").c_str(), loader_map); \
}


#define CCB_CREATE(object_type) \
static CCNode * create##object_type##Node() { \
    std::map<std::string, CCNodeLoader*> loader_map; \
    std::string classname = #object_type; \
    INSERT_LOADER_MAP(object_type); \
    return loadCCBFile((classname + ".ccbi").c_str(), loader_map); \
}
克里斯·奥尔森

当可变参数列表为空时,编译器可能会抱怨尾随逗号。GCC和Visual Studio编译器支持非标准扩展,##__VA_ARGS__以禁止尾随逗号:

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)

即使没有##扩展名,Visual Studio编译器也会抑制尾随逗号

见GCC文档这里,和Visual Studio文档在这里

如果您需要符合标准的解决方案,请在此问题的答案中详细介绍

因此,如果您使用的是gcc或Visual Studio,则可以通过以下简单更改使用原始宏:

#define CCB_CREATE(object_type,...) \
static CCNode * create##object_type##Node() { \
    std::map<std::string, CCNodeLoader*> loader_map; \
    std::string classname = #object_type; \
    FOR_EACH(INSERT_LOADER_MAP,object_type,##__VA_ARGS__); \
    return loadCCBFile((classname + ".ccbi").c_str(), loader_map); \
}

编辑:您也需要##__VA_ARGS__FOR_EACH()宏中使用扩展名,或者使用ugoren建议的更优雅的修改。

#define FOR_EACH(what, x, ...) FOR_EACH_(FOR_EACH_NARG(x, ##__VA_ARGS__), what, x, __VA_ARGS__)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用SCons定义C ++预处理程序宏

来自分类Dev

for循环中的C预处理程序串联

来自分类Dev

在R中创建并追加到数据框(错误:自变量表示行数不同:0、1)

来自分类Dev

保存C ++预处理程序宏的原始值

来自分类Dev

每个自变量的线性回归循环分别针对因变量

来自分类Dev

变量1 =({statement 1; statement 2;})在C中的构造

来自分类Dev

2循环1递减的变量

来自分类Dev

组合预处理程序宏和变量

来自分类Dev

呼叫中的参数#1缺少自变量

来自分类Dev

C ++ 11:typedef std :: function和自变量

来自分类Dev

避免在C预处理程序中使用双宏替换

来自分类Dev

ggplot2:在自变量上绘制积分的简单方法?

来自分类Dev

C预处理程序:及早评估宏

来自分类Dev

您将如何对C ++中的一组自变量应用相同的操作?

来自分类Dev

C宏使用文字vs变量产生不同的结果

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

具有自变量和1个标准偏差的线性回归

来自分类Dev

在Eigen 2库中使用linearRegression时模板自变量推导/替换失败

来自分类Dev

C预处理程序宏多个参数

来自分类Dev

具有2个参数的C ++预处理宏

来自分类Dev

Rails:自变量数量错误(0代表1)

来自分类Dev

使用__LINE__的C:宏中的预处理程序指令

来自分类Dev

MSVC汇编函数自变量C ++与_asm

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

使用c预处理程序宏进行多级调试

来自分类Dev

在面板数据中创建滞后 (t-1) 自变量

来自分类Dev

来自变量的批处理文件夹权限

来自分类Dev

R循环遍历lm函数中的自变量

来自分类Dev

如何使用 lmfit 修复此拟合例程(2 个自变量)?

Related 相关文章

热门标签

归档