枚举、宏、Unicode和标记粘贴
嗨,我是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,则无需记住还需要为此新动物添加新的订单函数定义。 链接器会给你一个错误提醒你!
宏字符串替换是一个强大的工具,可以利用它将内部数据存储在一个位置。 将这些数据保存在一个位置可以减少出错、漏诊或漏诊的机会 案例。