分享
 
 
 

C/C++关于版本兼容的方法.txt

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

引言

编程多了,常常有些感触.笔者发现在windows下很多结构都有一个dwSize来表示这个结构多大,实际上这个成员是用来进行版本兼容的.

最典型的一个结构就是OPENFILENAME.这个结构用在了打开文件对话框.里面的第一个成员lStructSize就是用来存放结构的大小.使用在不同的环璄下

_WIN32_WINNT > 0x0500 时和不定义这个宏sizeof(OPENFILENAME)会不一样的那么lStructSize就会不一样,这样windows内部根据这个成员来得知程序运行的版本.

所显示出的对话框就会不相同.这些都是大家共知的啦,笔者谈了这些只是想引入一个话题:我们如何来进行代码的兼容性.

正题

我们先来看如下的一个例子.

a.h

typedef struct tagOPTION

{

DWORD dwSize;

DWORD AAA;

DWORD BBB;

DWORD CCC;

}OPTION;

比如这是我定义的一个结构可以进行一些功能的设置.

通过一个结构的指针传给我写的一个引出函数 HRESULT SetOption(OPTION *);

我在代码里判断结构大小如果大小==sizeof(OPTION)则进行操作,否则返回一个错误代码.

在代码用了一些时间后我们需要对这个结构进行扩充,但要求对以前的这个版本兼容.由于这个头文件是给了别的开发者用的.兼容性要考虑到那些开发者生成的可执行代码是可以在新的平台上运行的.

这时我的dwSize就发挥了强大的作用,我只需要判断一下dwSize是不是旧版本的大小,如果是则调用原来的那份代码就可以了.

我的头文件马上变成了

typedef struct tagOPTION

{

DWORD dwSize;

DWORD AAA;

DWORD BBB;

DWORD CCC;

#ifdef MYSYSTEMVER >= 2

DWORD DDD;

#endif

}OPTION;

把旧的SetOption改为SetOption_V1()

新开了一个函数SetOption调用方式相同

HRESUT SetOptiton(OPTION * opt)

{

if(opt->dwSize == 12)

return SetOption_V1(opt)

if(opt->dwSize == sizeof(OPTION))

.....

}

难道我们一定要在代码中留下MagicNumber吗?

所以再改

#define SIZE_OPTION_V1 12

HRESUT SetOptiton(OPTION * opt)

{

if(opt->dwSize == SIZE_OPTION_V1 )

return SetOption_V1(opt)

if(opt->dwSize == sizeof(OPTION))

.....

}

代码现在不错了,但是笔者认为代码现在还不理想.因为手动算大小很容易把结构算错.

如果结构成员多了,我们如何来计算呢?,还有SetOption_V1里的代码还有一个sizeof(OPTION)也要改一下

不然原来的代码可不能运行得了.

但是#define OPTION_V1 sizeof(OPTION)会总是新版本的大小.

又想用sizeof()来自动计算结构的大小.

天无绝人之路我还是想到了方法

比如旧版文件采用如下方法编写

typedef struct tagOPTION_CORE

{

DWORD dwSize;

DWORD AAA;

DWORD BBB;

DWORD CCC;

}OPTION_CORE;

typedef OPTION_CORE OPTION_V1;

typedef OPTION_CORE tagOPTION_V1;

const SIZE_OPTION_V1 = sizeof(OPTION_V1);

#define OPTION OPTION_V1

如果需要升级则新加如下代码

struct tagOPTIONV2:public OPTION_CORE

{

DWORD DDD;

};

typedef tagOPTIONV2 OPTIONV2;

const SIZE_OPTION_V2 = sizeof(OPTIONV2)

#undef OPTION

#define OPTION tagOPTIONV2

#endif

现在我的代码就变成了

HRESUT SetOptiton(OPTION * opt)

{

if(opt->dwSize == SIZE_OPTION_V1 )

return SetOption_V1(opt)

if(opt->dwSize == SIZE_OPTION_V2)

.....

}

如果还需要升级只需要按以上的代码再新加一个结构.

并且使用者永远只需要使用OPTION结构,并且sizeof(OPTION)总等于他拿到的头文件的版本中结构的大小.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有