c++ - 为什么需要告诉结构它们有多大?

标签 c++ c struct sizeof

我注意到在 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/

相关文章:

c++ - C++中的读写互斥量

c++ - 对程序的编译时属性进行基准测试

c++ - 当内存被其他对象使用时不要删除ptr

objective-c - 如何在 Objective-C 中创建 C 文件中定义的结构实例

c++ - 错误:无法转换为简单的 std::string 文件 slurper

c - 如何在C中删除双向链表中的替代节点?

c - 读取文件和指针时出现段错误 : 11,

c++ - 填充结构/类时如何获取枚举的值

打印 float 错误的代码以及如何按结构中的元素排序

python-3.x - 如何从 Python Dict 创建 Protobuf Struct?