Я видел это в каком-то коде C:
Wininfo W = { sizeof(Wininfo) };
Что, черт возьми, это значит?
Я видел это в каком-то коде C:
Wininfo W = { sizeof(Wininfo) };
Что, черт возьми, это значит?
Этот код инициализирует struct
, используя необычный синтаксис инициализатора C для инициализации каждого поля в порядке объявления, см. http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=421. Важным побочным эффектом в случае этого примера является то, что в остальных полях не указываются значения для инициализации нулями.
Этот трюк является относительно распространенным в API-интерфейсах Win32 — API требует, чтобы размер был предварительно установлен как способ указать версию, с которой скомпилирован клиентский код — во многих из этих случаев также ожидается, что нужно очистить буфер, который обычно включает отдельный вызов, например, memset
перед инициализацией поля размера с помощью sizeof
.
См. также Инициализация структуры языка программирования C/C++? Примеры
Это выражение инициализации, которое устанавливает первое поле W
в sizeof(Wininfo)
, а остальные поля равны нулю.
Во-первых, это не заявление, это декларация. Объявления не являются операторами в C.
Во-вторых, часть = { /* whatever */ }
является инициализатором — она указывает начальное значение объекта. Обычно вы используете инициализаторы, заключенные в {}
, для инициализации агрегатных объектов: массивов или структур. Однако малоизвестная особенность языка C заключается в том, что инициализаторы скалярных объектов также могут быть необязательно заключены в {}
, как в
int i = { 5 };
Что именно означает ваше конкретное объявление, зависит от типа Wininfo
. Если W
является агрегатом, то его первый член инициализируется значением sizeof(Wininfo)
, а остальные инициализируются нулями. Если W
является скаляром, то он просто получает начальное значение sizeof(Wininfo)
.