分享
 
 
 

C/C++中macro的一些特殊使用

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

ISO C++推出之后,C/C++中宏(macro)的使用一直都备受争议,就好像当年保守诟病的goto语句一样。有所不同的是,现在的C/C++代码中使用goto语句的使用率是越来越少了。而macro仍然在C/C++ programming中占据一席之地——例如集赞誉之耀和诋毁之辱于一身的Microsoft Foudation Classes就把macro的强大功能发挥得淋漓尽致。套用“存在着就是合理”,macro的存在必定有其合理的因素。事实上,如果在programming的时候充分发挥macro的机制,就能写出一些巧妙精致而且设计合理的代码

我在工作中阅读了一个引擎的代码,引擎在某处就比较巧妙地利用了macro的功能。在此我将其整理出来

,供大家学习交流。

大家在进行C/C++ programming的时候,常常定义一些枚举类型的数据,例如:

enum EMessage

{

MSG_OPEN,

MSG_CLOSE,

MSG_COPY,

MSG_PASTE

};

在某些时候,比如在调试某段程序的时候,使用调试器捕获了某个枚举变量的值,这时候我们所能得到的是一些数值。例如当变量EMessage eMsg = MSG_OPEN的时候,我们能观察到eMsg = 0。但是单单一个“0”的话一下子让人难以明白它的含义,如果想在屏幕上也能打印出枚举的名称就更加不好办了。

解决这个问题,方法之一,就是利用macro的强大灵活的机制。现在我们来一步一步地分析如何利用macro来解决上述的问题。

想打印枚举的名称,你首先想到的肯定是:使用一个字典数据结构记录枚举变量和描述字符串的映射关系。例如:

#include <map>

using namespace std;

map<EMessage,const char*> MsgDesc; //为了节省空间,不使用string存储描述信息

MsgDesc[MSG_OPEN] = "MSG_OPEN";

MsgDesc[MSG_CLOSE] = "MSG_CLOSE";

MsgDesc[MSG_COPY] = "MSG_COPY";

MsgDesc[MSG_PASTE] = "MSG_PASTE";

使用字典数据结构很方便,但是如果枚举值很少的时候,使用一个map类型的对象来管理这些东西似乎有点暴殄天物(或许对于现在的硬件设备而言不算什么,但是如果性能有着严格要求的话。。。)。如果枚举值很多的话,每添加一个新的枚举量就要在枚举定义内写一次,在把枚举量描述添加进字典中又要写一次,尤为繁琐。

如果使用macro机制的话,可以通过预编译和macro机制一次性处理上述的问题。

例如:在文件msgdef.h中

#ifndef _MSGDEF_H_

#define _MSGDEF_H_

#undef USEMACRO

#if defined(INCLUDE_AS_ENUM) //判断预编译宏的设置情况,判断是转换成enum还是string

#define MSG_MACRO(msg) msg,

#elif defined(INCLUDE_AS_STRING)

#define MSG_MACRO(msg) #msg, //不能遗忘“,”号

#else

#error To use this include file, first define either INCLUDE_AS_ENUM or INCLUDE_AS_STRING

#endif

//有新定义的message 枚举值的话,就只是需要在此添加

MSG_MACRO(MSG_OPEN)

MSG_MACRO(MSG_CLOSE)

MSG_MACRO(MSG_COPY)

MSG_MACRO(MSG_PASTE)

#endif

而使用的时候,就要如此使用,例如在main.cpp中

//定义消息的描述数组

char MsgDesc[32][32] = //要预先估计msg的数量

{

#define INCLUDE_AS_STRING //要使用msgdef.h中所指定的两个宏中的一个,否则会编译出错

#include "msgdef.h"

#undef INCLUDE_AS_STRING //要把它取消,以便可是设置成

};

//定义消息的枚举类型

enum EMessage

{

#define INCLUDE_AS_ENUM

#include "msgdef.h"

#undef INCLUDE_AS_ENUM

};

这样,就可以使用枚举和描述它的字符串信息了。

另外,本文附带了一个完整的示例程序,在本机环境(Windows 2000+SP4,VC6 +SP5 )下编译通过,但是似乎csdn blog无法上传附件(或许可以,不妨赐教?

),所以需要示例程序的朋友请来信: son_of_lover@163.com

欢迎交流指正。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有