vs2015 c++ 宏展开枚举

本文讨论了在VS2015中使用C++宏和模板处理大量枚举类型的复杂性,以及遇到的编译问题和解决方案尝试。作者分享了如何通过宏定义实现常量代码的固定和参数化转换。
摘要由CSDN通过智能技术生成

C++宏-模板

vs2015 使用宏展开枚举


前言

corba客户端,使用了大量的枚举类型,需要对其标识和取值


一、开始编写代码,对每一个枚举需要写一大段if-else或者case

二、尝试使用模板,发现好像无法使用枚举元素名,返回字符串(不理解区域,尝试的方法可能不正确)。

二、使用宏,复杂的宏确实难搞,发现无法编译通过,或者结果不正确,花了很多时间实现。

#define ATTR(x) x

#define ARGS_IMPL2(base, count) base##count
#define ARGS_IMPL(base, count) ARGS_IMPL2(base, count)

#define COUNT_PARMS_IMP(x, ...) ATTR(COUNT_PARMS_IMP_HELPER(__VA_ARGS__,17,16,15,14,13,12, 11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
#define COUNT_PARMS_IMP_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11,_12,_13,_14,_15,_16,_17, N, ...) N
#define COUNT_PARMS(x,...) COUNT_PARMS_IMP(x, __VA_ARGS__)

#define ARG_VAL_0(arg) (throw ParamException("enum arg unkown(%s)",arg))
#define ARG_VAL_1(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_0(arg)))
#define ARG_VAL_2(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_1(arg, __VA_ARGS__)))
#define ARG_VAL_3(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_2(arg, __VA_ARGS__)))
#define ARG_VAL_4(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_3(arg, __VA_ARGS__)))
#define ARG_VAL_5(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_4(arg, __VA_ARGS__)))
#define ARG_VAL_6(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_5(arg, __VA_ARGS__)))
#define ARG_VAL_7(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_6(arg, __VA_ARGS__)))
#define ARG_VAL_8(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_7(arg, __VA_ARGS__)))
#define ARG_VAL_9(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_8(arg, __VA_ARGS__)))
#define ARG_VAL_10(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_9(arg, __VA_ARGS__)))
#define ARG_VAL_11(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_10(arg, __VA_ARGS__)))
#define ARG_VAL_12(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_11(arg, __VA_ARGS__)))
#define ARG_VAL_13(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_12(arg, __VA_ARGS__)))
#define ARG_VAL_14(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_13(arg, __VA_ARGS__)))
#define ARG_VAL_15(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_14(arg, __VA_ARGS__)))
#define ARG_VAL_16(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_15(arg, __VA_ARGS__)))
#define ARG_VAL_17(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_16(arg, __VA_ARGS__)))

#define ARG_STRING_0(arg) ("unknown")
#define ARG_STRING_1(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_0(arg)))
#define ARG_STRING_2(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_1(arg, __VA_ARGS__)))
#define ARG_STRING_3(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_2(arg, __VA_ARGS__)))
#define ARG_STRING_4(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_3(arg, __VA_ARGS__)))
#define ARG_STRING_5(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_4(arg, __VA_ARGS__)))
#define ARG_STRING_6(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_5(arg, __VA_ARGS__)))
#define ARG_STRING_7(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_6(arg, __VA_ARGS__)))
#define ARG_STRING_8(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_7(arg, __VA_ARGS__)))
#define ARG_STRING_9(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_8(arg, __VA_ARGS__)))
#define ARG_STRING_10(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_9(arg, __VA_ARGS__)))
#define ARG_STRING_11(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_10(arg, __VA_ARGS__)))
#define ARG_STRING_12(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_11(arg, __VA_ARGS__)))
#define ARG_STRING_13(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_12(arg, __VA_ARGS__)))
#define ARG_STRING_14(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_13(arg, __VA_ARGS__)))
#define ARG_STRING_15(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_14(arg, __VA_ARGS__)))
#define ARG_STRING_16(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_15(arg, __VA_ARGS__)))
#define ARG_STRING_17(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_16(arg, __VA_ARGS__)))

#define ARGS_TO_STRING(x, ...) ATTR(ARGS_IMPL(ARG_STRING_, COUNT_PARMS(x, __VA_ARGS__))(x, __VA_ARGS__))
#define ARGS_TO_VALUE(x, ...) ATTR(ARGS_IMPL(ARG_VAL_, COUNT_PARMS(x, __VA_ARGS__))(x, __VA_ARGS__))

总结

一些常不变的代码,可以固定起来。

  • 32
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sourceinsight是一款常用的代码编辑工具,它支持C/C++、Java、Python等多种编程语言的代码编辑和查看。在sourceinsight中,展开是一种功能,它可以帮助我们在编写代码的过程中更方便地查看和理解展开效果。 (Macro)是一种在程序中定义并重复使用的代码片段,在预处理阶段会被替换为相应的代码。而在sourceinsight中,我们可以通过展开功能来查看定义在具体代码中展开后的效果。 使用sourceinsight的展开功能,我们可以通过以下几个步骤来进行操作: 1. 打开sourceinsight,在编辑器中打开所在的源文件。 2. 在编辑器中找到需要展开,并将光标定位在上。 3. 点击sourceinsight菜单栏中的"编辑" -> "展开",或者使用快捷键"Ctrl + Shift +E"来展开。 4. 在展开后的代码中,我们可以看到在具体位置展开后的代码效果。 通过展开功能,我们可以更清晰地了解在代码中的展开效果,这对于理解和调试代码非常有帮助。同时,展开功能也可以帮助我们在定义较为复杂的情况下,更方便地查看展开后的代码逻辑,提高代码编写的效率。 总之,sourceinsight的展开功能是一种非常实用的功能,它能够帮助我们更好地理解和调试代码,在编写代码时起到辅助作用,提高代码编写效率。 ### 回答2: SourceInsight是一款功能强大的源代码阅读和浏览工具,能够方便地浏览、编辑和调试源代码。它支持多种编程语言,并提供了一系列有用的功能来提高开发人员的工作效率。 在SourceInsight中,展开是指将源代码中的定义展开为实际的代码。定义是一种预处理器指令,它可以在编译之前对源代码进行文本替换。定义通常用于简化重复的代码片段,提高程序的可读性和可维护性。 要在SourceInsight中展开定义,首先需要在源代码中定义。可以使用#define指令来定义,语法形式如下: #define 名是定义的的名称,值是的实际替换文本。 在进行展开时,SourceInsight会根据源代码中的定义,将所有使用该的地方替换为的实际值。展开后的代码可以方便地阅读和调试。 要进行展开,可以使用SourceInsight提供的展开功能。在SourceInsight的工具栏中,可以找到一个名为"展开器"的按钮。点击该按钮,将打开一个新的窗口,显示当前文件的展开结果。 展开器窗口的左侧显示源代码中的定义,右侧显示展开后的代码。可以通过双击定义来查看展开结果。在展开器窗口中,还可以对展开后的代码进行修改和调试。 总之,SourceInsight提供了便捷的展开功能,可以方便地查看和调试展开后的代码。它有助于开发人员理解和优化的使用,提高工作效率。 ### 回答3: Source Insight是一个强大的源代码浏览和编辑工具,而展开是其其中的一个功能。 在Source Insight中,展开是指将代码中使用的进行展开,使之变为定义所代表的实际代码。在编程过程中,我们经常会使用来简化代码和增加可读性,但在展开之前,代码中的只是一串字符,没有实际的含义。 要进行展开,首先需要在Source Insight的文件中定义文件是一个文本文件,其中包含了的定义和相关的命令。在文件中,我们可以定义以及的参数,还可以编写一系列的命令来执行一些操作,例如查找、替换、插入代码等。 当我们在源代码中使用时,Source Insight会根据文件中的定义来进行展开展开过程中,的参数会被替换为调用时传入的值,这样定义的代码就会被插入到相应的位置。 通过展开,我们可以在不改变源代码的情况下增加一些额外的功能。例如,我们可以定义一个来自动生成一些重复的代码,或者在特定的位置自动插入一些标记,方便我们进行代码的调试和分析。 综上所述,Source Insight的展开功能是一种非常有用的工具,可以帮助程序员简化和优化代码的编写和阅读。展开可以通过文件的定义来实现,通过将代码中的替换为相应的代码,以达到编写代码的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值