为什么很多Windows API使用的结构体都会有一个记录结构体长度的成员

gentlelotus 2007-12-10 11:51:24
记得曾经在哪本书上看到过这个问题的答案,现在却想不起来了。因为看到有些人现在写的代码中还会在结构体中放置一个记录自身字节长度的成员,想不起来有什么必要,所以才有此一问。
...全文
207 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mltong 2011-06-28
  • 打赏
  • 举报
回复
之前的确看到一些结构体中都有一个成员用来记录本结构体的大小,不过当时没有想太多。

今天我也忍不住why?不浪费吗?

看上上面的一些回复,感觉还不是很理解。
zhangystc 2007-12-10
  • 打赏
  • 举报
回复
感觉还是一楼说得对,是为了版本的原因,Windows程序设计里似乎提到过
pomelowu 2007-12-10
  • 打赏
  • 举报
回复
简单的说就是为了防止错误。。。
zaodt 2007-12-10
  • 打赏
  • 举报
回复
因为结构体成员中有不确定长度的成员存在。
linzhengqun 2007-12-10
  • 打赏
  • 举报
回复
因为版本,比如一个API提供一个结构参数,但以后这个结构可能会扩充。
通过这个Size,API就可以判断是哪个版本的结构体,从而做出正确的操作。
gentlelotus 2007-12-10
  • 打赏
  • 举报
回复
“完成端口”?抱歉,我并不清楚这个是什么,可否告诉一个能在msdn中查找的关键字?
dayong576 2007-12-10
  • 打赏
  • 举报
回复
有位牛比人士曾经说过:API不要去学,在需要的时候去查API帮助就足够了。
zhoujianhei 2007-12-10
  • 打赏
  • 举报
回复
第二点,扩充方面,重叠结构的使用.
典型例子,可以看一下完成端口。
gentlelotus 2007-12-10
  • 打赏
  • 举报
回复
三楼pomelowu的说法似曾听说,不知道可否说的详细一些,如果没有这个成员可能在什么情况下造成什么样的错误?加入这个成员后如何消除这些错误?等等,谢谢先。
gentlelotus 2007-12-10
  • 打赏
  • 举报
回复
版本管理和扩充这两个原因我也曾考虑过,不过我个人还是有些疑问。第一点,单单通过一个长度参数来区别版本这种做法本身并不是很合适,不同版本的相同结构具有相同的长度是很有可能的,而且这也直接造成了逻辑上的不一致,真是为了区分版本还不如直接使用一个版本号来得清爽和谐(不过也许考虑到把扩充这样的多功能集于一身的问题,微软做了些妥协罢);第二点,扩充方面,重叠结构的使用手法我见过,不过除非是官方的扩充,API内部是不需要理睬扩充的成员的,也不可能去理睬,毕竟那不是微软做的扩充,他们不可能预先知道扩充的结构含义,所以这个结构是否扩展了的信息对于API而言不是必须要知道的,而官方的扩展一般都有明显的标志来区分。另外,我个人不是特别熟悉window API,我所知道的结构体扩充最典型也就是DLGTEMPLATE,但是DLGTEMPLATE的扩充并没有使用结构体长度这种方式,甚至它跟本就没有这个成员。因此希望有人能举出微软使用结构体长度做为版本标记或者扩充支持的一些实际的例子来看看。不介意缩短键盘寿命的话再说说现在的C程序设计中是否还需要这样的风格那就更好。多谢楼上各位的建议。
WAKU 2007-12-10
  • 打赏
  • 举报
回复
为了区别版本以后扩展用
jsphuang 2007-12-10
  • 打赏
  • 举报
回复
增强C语言最初的设计
pptor 2007-12-10
  • 打赏
  • 举报
回复
觉得一楼的对 ,可以通过结构判断是那个版本的结构体
还有一个可能是为了扩展
zhoujianhei 2007-12-10
  • 打赏
  • 举报
回复
1.版本的原因.
2.重叠结构。
如下:

struct str
{
int size;
long l;
};

struct strext
{
int size;
long l;
char mydata[40];
};
社会栋梁 2007-12-10
  • 打赏
  • 举报
回复
一为效率二为扩展

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧