文档章节

C++ boost.preprocessor自动定义枚举

 百之姓
发布于 2016/05/15 01:03
字数 453
阅读 466
收藏 1

行业解决方案、产品招募中!想赚钱就来传!>>>

想定义一个宏,实现目的如下:

ZME_PP_ENUM_DEF(name, ...);

展开之后是:

enum    E_name

{

E_name_NULL,

E_name_0,

E_name_1,

.......

E_name_COUNT

};

例如:ZME_PP_ENUM_DEF(TST, A, B, C, D);

展开之后是:

enum    E_TST

{

E_TST_NULL,

E_TST_A,

E_TST_B,

E_TST_C,

E_TST_D,

E_TST_COUNT

};

具体的实现代码如下:


#define ZME_LOOP_PRED_4(r, state) \
    BOOST_PP_LESS(\
    BOOST_PP_TUPLE_ELEM(4, 0, state), \
    BOOST_PP_TUPLE_ELEM(4, 1, state) \
    )   \
    /**/

#define ZME_LOOP_OP_4(r, state) \
    (\
    BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 0, state)), \
    BOOST_PP_TUPLE_ELEM(4, 1, state), \
    BOOST_PP_TUPLE_ELEM(4, 2, state), \
    BOOST_PP_TUPLE_ELEM(4, 3, state) \
    ) \
    /**/
#define  ZME_LOOP_FOR4(opt, arg, ...)    BOOST_PP_FOR((0, BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), BOOST_PP_VARIADIC_TO_LIST(__VA_ARGS__), arg), ZME_LOOP_PRED_4, ZME_LOOP_OP_4, opt)/**/

/*定义循环方法:*/

方法1:
#define         ZME_PP_ENUM_DEF_FOR_DO(r, state)        BOOST_PP_CAT(BOOST_PP_LIST_AT((BOOST_PP_TUPLE_ELEM(4, 3, state),BOOST_PP_NIL), 0),BOOST_PP_LIST_AT(BOOST_PP_TUPLE_ELEM(4, 2, state), BOOST_PP_TUPLE_ELEM(4, 0, state))),/**/

方法2:
#define         ZME_PP_ENUM_DEF_FOR_DO(r, state)        BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(4, 3, state), \
                                                        BOOST_PP_LIST_AT(BOOST_PP_TUPLE_ELEM(4, 2, state), BOOST_PP_TUPLE_ELEM(4, 0, state))),/**/

方法2中正常理解BOOST_PP_TUPLE_ELEM(4, 3, state)展开之后就是arg,但是这种方法在linux系统(我用的是KALI2.0)下是没问题的,但是在VS2013下,编译错误:

错误    1    error C2143: 语法错误 : 缺少“}”(在“(”的前面)   
错误    2    error C2143: 语法错误 : 缺少“;”(在“<L_TYPE_raw>”的前面)   
错误    3    error C2059: 语法错误:“<L_TYPE_raw>”   
错误    4    error C2143: 语法错误 : 缺少“;”(在“}”的前面)   
错误    5    error C2065: “E_TST_NULL”: 未声明的标识符   
.........

 

BOOST_PP_CAT在BOOST_PP_FOR中使用好像有问题。解决方法就是使用方法1,先把BOOST_PP_TUPLE_ELEM(4, 3, state)也就是arg转化为BOOST_PP_LIST,然后再取其第一个值。

/* 定义枚举结构 */
#define         ZME_PP_ENUM_DEF(name, ...)        enum    E_##name    {                    \
                        E_##name##_NULL,                                                \
                        ZME_LOOP_FOR4(ZME_PP_ENUM_DEF_FOR_DO, E_##name##_, __VA_ARGS__)    \
                        E_##name##_COUNT                                                \
                        };/**/

/********************************************************************************/

/* OK, 这样就可以定义我们的枚举了。*/

ZME_PP_ENUM_DEF(TST, A, B, C, D);

printf("ZME_PP_ENUM_DEF: %d, %d, %d, %d, %d, %d\n", E_TST_NULL, E_TST_A, E_TST_B, E_TST_C, E_TST_D, E_TST_COUNT);

win8.1+vs2013、kali2.0测试通过。

 

 

粉丝 0
博文 1
码字总数 453
作品 0
大兴
程序员
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
C++模板库--C++ B-tree

这是一个google开源的C++模板库,实现了基于B-tree数据结构的有序内存容器。类似于STL的map、set、multimap和multiset模板,C++ B-tree也提供了btreemap、btreeset、btreemultimap和btreemu...

匿名
2013/02/05
3.3K
1
C/C++ 代码文档生成器--cldoc

cldoc 是一个使用 clang 实现的 C/C++ 代码文档生成器。 特点: 使用 clang 可靠解析大多数复杂的 C++ 项目 零配置 使用 markdown 做为文档格式 生成描述 API 的 XML 文档 使用简单格式用于文...

匿名
2013/02/14
1.4K
0
C++ 软件生态系统--Ryppl

Ryppl 是由 Boost 项目的一些成员创建的项目,因为意识到 Boost 越来越耦合、笨拙以及依赖于定制的架构。因此他们决定开始 Ryppl 项目。 Ryppl 项目的目的就是创建一个可移植的模块化的 C++ ...

匿名
2013/03/06
1.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

揭秘神秘的MarxDB

主题:MarxDB金融级分布式数据库 大纲: 1、石老师好像是第一次来3306π,可以先重点自我介绍一下。 2、石老师可以简单介绍一下MarxDB的情况吗? 3、跟传统的关系型数据库相比,MarxDB有什么...

叶金荣
昨天
0
0
ASP.NET Core搭建多层网站架构【13-扩展之支持全球化和本地化多语言】

2020/02/03, ASP.NET Core 3.1, VS2019, ResXManager 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构【13-扩展之支持全球化和本地化多语言】 使用资源管理多语言文件实现网站本地化...

osc_wip0vvls
17分钟前
9
0
浙江移动正式采用蚂蚁集团自研数据库OceanBase

近日,浙江移动正式引入蚂蚁集团的自研数据库OceanBase,首期应用于其政企网格智慧运营系统,这也是OceanBase首次落地于运营商场景。 政企网格智慧运营平台是浙江移动针对政企用户推出的服务...

支付宝技术
昨天
0
0
使用Charles代理功能将网络请求定向至本地文件

  最近在进行前端开发的时候发现Charles一个非常牛叉的功能,就是可以通过代理将网络请求定向至本地文件。有了这个功能在进行iOS开发时就可以在缺少后台接口的情况下更加真实的进行数据moc...

osc_qvtw8r10
18分钟前
7
0
多边形裁剪图片升级啦!Cocos Creator !

支持合图,支持gizmo添加节点和调整位置,支持缩放旋转。文章底部获取完整项目! 效果预览与使用 原理 回顾 在gizmo入门探索介绍了 gizmo 与多边形裁剪的配合。 在使用 mesh 实现多边形裁剪图...

白玉无冰
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部