求问:为什么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()不就行了嘛
[解决办法]