Это для обратной совместимости при расширении Windows API.
Представьте себе следующие декларации
struct WinData
{
long flags;
}
BOOL GetWinData(WinData * wd);
который вы называете так:
WinData wd;
GetWinData(&wd);
Будущая версия ОС может расширить это до
struct WinData
{
long flags;
long extraData;
}
Однако, если вы скомпилировали по «старому» SDK, GetWinData
не сможет выяснить, что вы не знаете о extraData
. Если бы он заполнил это независимо, он переписал бы данные в стеке. BOOOM!
Вот почему в структуру добавляется «размер, известный вызывающей стороне», и новые члены добавляются в конце. Реализация GetWinData
может проверить размер и решить, «этот бедняга еще не знает обо всех новых функциях».