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

时间:2022-08-30 19:09:36
记得曾经在哪本书上看到过这个问题的答案,现在却想不起来了。因为看到有些人现在写的代码中还会在结构体中放置一个记录自身字节长度的成员,想不起来有什么必要,所以才有此一问。

15 个解决方案

#1


因为版本,比如一个API提供一个结构参数,但以后这个结构可能会扩充。
通过这个Size,API就可以判断是哪个版本的结构体,从而做出正确的操作。

#2


因为结构体成员中有不确定长度的成员存在。

#3


简单的说就是为了防止错误。。。

#4


感觉还是一楼说得对,是为了版本的原因,Windows程序设计里似乎提到过

#5


一为效率二为扩展

#6


1.版本的原因.
2.重叠结构。
如下:

struct str
{
int size;
long l;
};

struct strext
{
int size;
long l;
char mydata[40];
};

#7


觉得一楼的对 ,可以通过结构判断是那个版本的结构体
还有一个可能是为了扩展

#8


增强C语言最初的设计

#9


为了区别版本以后扩展用

#10


版本管理和扩充这两个原因我也曾考虑过,不过我个人还是有些疑问。第一点,单单通过一个长度参数来区别版本这种做法本身并不是很合适,不同版本的相同结构具有相同的长度是很有可能的,而且这也直接造成了逻辑上的不一致,真是为了区分版本还不如直接使用一个版本号来得清爽和谐(不过也许考虑到把扩充这样的多功能集于一身的问题,微软做了些妥协罢);第二点,扩充方面,重叠结构的使用手法我见过,不过除非是官方的扩充,API内部是不需要理睬扩充的成员的,也不可能去理睬,毕竟那不是微软做的扩充,他们不可能预先知道扩充的结构含义,所以这个结构是否扩展了的信息对于API而言不是必须要知道的,而官方的扩展一般都有明显的标志来区分。另外,我个人不是特别熟悉window API,我所知道的结构体扩充最典型也就是DLGTEMPLATE,但是DLGTEMPLATE的扩充并没有使用结构体长度这种方式,甚至它跟本就没有这个成员。因此希望有人能举出微软使用结构体长度做为版本标记或者扩充支持的一些实际的例子来看看。不介意缩短键盘寿命的话再说说现在的C程序设计中是否还需要这样的风格那就更好。多谢楼上各位的建议。

#11


三楼pomelowu的说法似曾听说,不知道可否说的详细一些,如果没有这个成员可能在什么情况下造成什么样的错误?加入这个成员后如何消除这些错误?等等,谢谢先。

#12


第二点,扩充方面,重叠结构的使用.
典型例子,可以看一下完成端口。

#13


有位牛比人士曾经说过:API不要去学,在需要的时候去查API帮助就足够了。

#14


“完成端口”?抱歉,我并不清楚这个是什么,可否告诉一个能在msdn中查找的关键字?

#15


之前的确看到一些结构体中都有一个成员用来记录本结构体的大小,不过当时没有想太多。

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

看上上面的一些回复,感觉还不是很理解。

#1


因为版本,比如一个API提供一个结构参数,但以后这个结构可能会扩充。
通过这个Size,API就可以判断是哪个版本的结构体,从而做出正确的操作。

#2


因为结构体成员中有不确定长度的成员存在。

#3


简单的说就是为了防止错误。。。

#4


感觉还是一楼说得对,是为了版本的原因,Windows程序设计里似乎提到过

#5


一为效率二为扩展

#6


1.版本的原因.
2.重叠结构。
如下:

struct str
{
int size;
long l;
};

struct strext
{
int size;
long l;
char mydata[40];
};

#7


觉得一楼的对 ,可以通过结构判断是那个版本的结构体
还有一个可能是为了扩展

#8


增强C语言最初的设计

#9


为了区别版本以后扩展用

#10


版本管理和扩充这两个原因我也曾考虑过,不过我个人还是有些疑问。第一点,单单通过一个长度参数来区别版本这种做法本身并不是很合适,不同版本的相同结构具有相同的长度是很有可能的,而且这也直接造成了逻辑上的不一致,真是为了区分版本还不如直接使用一个版本号来得清爽和谐(不过也许考虑到把扩充这样的多功能集于一身的问题,微软做了些妥协罢);第二点,扩充方面,重叠结构的使用手法我见过,不过除非是官方的扩充,API内部是不需要理睬扩充的成员的,也不可能去理睬,毕竟那不是微软做的扩充,他们不可能预先知道扩充的结构含义,所以这个结构是否扩展了的信息对于API而言不是必须要知道的,而官方的扩展一般都有明显的标志来区分。另外,我个人不是特别熟悉window API,我所知道的结构体扩充最典型也就是DLGTEMPLATE,但是DLGTEMPLATE的扩充并没有使用结构体长度这种方式,甚至它跟本就没有这个成员。因此希望有人能举出微软使用结构体长度做为版本标记或者扩充支持的一些实际的例子来看看。不介意缩短键盘寿命的话再说说现在的C程序设计中是否还需要这样的风格那就更好。多谢楼上各位的建议。

#11


三楼pomelowu的说法似曾听说,不知道可否说的详细一些,如果没有这个成员可能在什么情况下造成什么样的错误?加入这个成员后如何消除这些错误?等等,谢谢先。

#12


第二点,扩充方面,重叠结构的使用.
典型例子,可以看一下完成端口。

#13


有位牛比人士曾经说过:API不要去学,在需要的时候去查API帮助就足够了。

#14


“完成端口”?抱歉,我并不清楚这个是什么,可否告诉一个能在msdn中查找的关键字?

#15


之前的确看到一些结构体中都有一个成员用来记录本结构体的大小,不过当时没有想太多。

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

看上上面的一些回复,感觉还不是很理解。