我注意到在 c/c++ 中,需要告知许多 Win32 API 结构它们有多大。
即 someStruct.pbFormat = sizeof(SomeStruct)
为什么会这样?仅仅是出于遗留原因吗?也知道“pb”代表什么吗?
编辑:哎呀,是的,我的意思是“cbFormat”
最佳答案
这是为了在扩展 Windows API 时向后兼容。
想象一下下面的声明
struct WinData
{
long flags;
}
BOOL GetWinData(WinData * wd);
你这样调用它:
WinData wd;
GetWinData(&wd);
future 的操作系统版本可能会将其扩展到
struct WinData
{
long flags;
long extraData;
}
但是,如果您针对“较旧”的 SDK 进行编译,GetWinData
没有机会发现您不知道 extraData
。如果它无论如何都将其填充,它将覆盖堆栈上的数据。砰!
这就是为什么将“调用者已知的大小”添加到结构中,并在末尾附加新成员的原因。 GetWinData
实现可以检查大小并确定“这个可怜的家伙还不知道所有新功能”。
关于c++ - 为什么需要告诉结构它们有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2940924/