求问:为什么Microsoft在SDK中设计的结构体中,很多结构体的第一个变量是结构体的大小?该怎么处理

求问:为什么Microsoft在SDK中设计的结构体中,很多结构体的第一个变量是结构体的大小?
如题,我刚刚开学学习Windows编程,但是发现,很多SDK中的结构体是下面的样子:[code=C/C++][/code]
typedef struct _OSVERSIONINFO { 
  DWORD dwOSVersionInfoSize;  
  DWORD dwMajorVersion;  
  DWORD dwMinorVersion;  
  DWORD dwBuildNumber; 
  DWORD dwPlatformId;  
  TCHAR szCSDVersion[128];
} OSVERSIONINFO;
我就是特别好奇,MS为什么要把第一个变量的意义设计成结构体的大小呢,这有什么意义吗?我感觉这个变量没什么用啊?

------解决方案--------------------
我也有类似的疑问:将结构体大小放到结构体里面的用意是什么?
借你的分同问下。

------解决方案--------------------
在不同的版本中,结构可能会扩展,windows判断这个size,然后知道是哪个版本
------解决方案--------------------
需要获取size的时候,直接访问成员变量
------解决方案--------------------
顶2楼
3楼有点扯,难道会为了编译的时候少费点事,就往内存里多扔点东西么
------解决方案--------------------
顶起,我也想知道,望高手回答。
------解决方案--------------------
我觉得这是个编程的习惯
------解决方案--------------------
2楼正解

sizeof()是编译时获取大小的吧

为结构体分配内存可以有多种方式:
例如:可以用HeapAlloc也可以用GlobalAlloc
获取大小对应的函数也不一样:
用HeapAlloc就得用HeapSize,用GlobalAlloc就得用GlobalSize
------解决方案--------------------
提示开发者在使用这个结构体时必须要求?字节对齐
------解决方案--------------------
因为API函数中参数如果是结构体,通常要求传入的是结构体的指针,这样做有两个好处:
1\减小传参时间.
2\可以对指针下的内容引用和赋值,即可以输入也可以输出.
在API函数代码中,一个指针,是无法通过sizeof()来获得尺寸的,因为总会得到4字节长度,而如果第一个变量如果是size,那么直接就*(DWORD*)就可以得到结构的尺寸.所以...
------解决方案--------------------
保持向前兼容
2楼正解!
------解决方案--------------------
API是有可能要升级的,相应的这些结构体也可能要升级,也就是在原有的结构体中保留原有的数据增加一些数据。所以此时大小就很重要了。
------解决方案--------------------
看2与14楼
------解决方案--------------------
我觉得12楼不靠谱
如果是为了动态分配,块的大小是在堆的数据结构中,而不是暴露在这里

14楼最准
------解决方案--------------------
在某些情况下,会不会是从通信的角度去考虑的呢——帧头确定整个数据包的大小
------解决方案--------------------
3楼、12楼说的挺好的啊,14楼跟他们也不冲突吧?
18楼理解貌似有问题,这个跟动态分配有啥关系?
------解决方案--------------------
2楼正解。是扩展所用。
------解决方案--------------------
我就是特别好奇,MS为什么要把第一个变量的意义设计成结构体的大小呢,这有什么意义吗?我感觉这个变量没什么用啊?

为了扩展,以后扩展的时候只需要往结构体后面加东西就可以了,然后判断大小就知道该怎么处理你结构体了。

至于大小变量放在第一个是为了写代码方便,举个例子:

OSVERSIONINFO versionInfo={sizeof(OSVERSIONINFO)};

这样能把第一个成员赋值同时其它成员清0
------解决方案--------------------
12楼靠谱,2楼14楼什么的,想根据大小判断版本,就像5楼说的:如果想得到这个结构体的大小,直接sizeof()不就行了嘛
------解决方案--------------------
探讨

12楼靠谱,2楼14楼什么的,想根据大小判断版本,就像5楼说的:如果想得到这个结构体的大小,直接sizeof()不就行了嘛