枚举、宏、Unicode和标记粘贴

枚举、宏、Unicode和标记粘贴

null

嗨,我是RoCyk开发人员在VisualC++的IDE团队。 我想讨论C++生成宏生成枚举编程技术。 我最近使用这个来区分各种C++类型,如类、变量和函数。 将类型列表放在一个文件中可以方便地添加类型,并允许多种不同类型的使用。 下面的例子反映了我所使用的代码。 我在其他各种源代码库的许多地方也看到了这种技术的使用,但我在教科书中没有看到过太多讨论,所以我想我应该强调一下这种技术。

考虑以下枚举:

枚举 动物{狗,猫,鱼,鸟};

现在可以用dog代替0。 您可以获得编译器强制的类型安全,而宏不提供。 VS调试器还将显示枚举的友好值,而不是整数。 但是,输出枚举值的函数需要更好的格式。 此代码可以帮助:

世界卫生组织 *动物描述[]={L “狗” ,左 “猫” ,左 “鱼” ,左 “鸟” };

有了这个数组,调试代码现在可以通过使用enum索引到字符串数组来打印enum的友好值。

使用宏生成的枚举,可以将枚举和友好名称作为一个实体进行维护。 以animal.inc文件为例:

髓鞘(狗)

髓鞘(猫)

髓鞘(鱼)

髓鞘(鸟)

下面的C++代码:

枚举 动物{

#定义 髓鞘,

#包括 “动物公司”

#未定义 髓鞘

};

世界卫生组织 *动物描述[]={

#定义 髓鞘 “_” 我#e,

#包括 “动物公司”

#未定义 髓鞘

};

现在编辑animal.inc将更新枚举和枚举的友好文本。 在本例中,我在之前使用的动物名称前面添加了下划线,以使宏正常工作。 令牌粘贴运算符##不能用作第一个令牌。 字符串化运算符#从运算符创建字符串。 在弦乐剧前加一个Ltor生成的字符串是宽字符串。

这些宏生成的枚举可以使用编译器开关/EP或/P进行“调试”。 这将导致编译器输出预处理器文件:

枚举 动物{

_狗,

_猫,

_鱼,

_鸟,

};

世界卫生组织 *动物描述[]={

L “_” L “狗” ,

L “_” L “猫” ,

L “_” L “鱼” ,

L “_” L “鸟” ,

};

C++允许在枚举和数组初始化器的最后一个条目之后逗号。

这种宏字符串替换技术可以进一步扩展以生成代码。 下面是使用字符串替换创建函数原型的示例:

#定义 髓鞘(e) 无效 订单###e();

#包括 “动物公司”

#未定义 髓鞘

这扩展到:

无效 订购狗();

无效 订购目录();

无效 订购鱼();

无效 订购鸟();

你可以根据动物的种类做一些动作。 如果打开动物的种类,下面是创建case标签和函数调用的示例:

#定义 髓鞘(e) 案例 _##电子邮件:

订单###e();

打破 ;

#包括 “动物公司”

#未定义 髓鞘

这扩展到:

案例 _狗:订购狗(); 打破 ;

案例 _cat:命令_cat(); 打破 ;

案例 _鱼:点鱼(); 打破 ;

案例 _鸟:订购鸟(); 打破 ;

在本例中,需要为Orderu dog()、Orderu cat()等添加函数定义。。 如果要将新动物添加到animal.inc,则无需记住还需要为此新动物添加新的订单函数定义。 链接器会给你一个错误提醒你!

宏字符串替换是一个强大的工具,可以利用它将内部数据存储在一个位置。 将这些数据保存在一个位置可以减少出错、漏诊或漏诊的机会 案例。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享