C-код, включающий {} - PullRequest
       16

C-код, включающий {}

8 голосов
/ 11 января 2010

Я видел это в некотором коде C:

Wininfo W = { sizeof(Wininfo) };

Что, черт возьми, это значит?

Ответы [ 3 ]

15 голосов
/ 11 января 2010

Этот код инициализирует struct с использованием синтаксиса funky C initializer для инициализации каждого поля в порядке объявления, см. http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=421. Важным побочным эффектом в случае этого примера является то, что в оставшихся полях одно не указывается значения для инициализируются нулями.

Этот прием является довольно распространенным в Win32 API - API требует, чтобы размер был задан заранее, чтобы указывать версию, с которой скомпилирован клиентский код - во многих из этих случаев также ожидается очистка буфер, который обычно включает в себя отдельный вызов, например, memset до инициализации поля размера с помощью sizeof.

См. Также Структурная инициализация языка программирования C / C ++? для соответствующих примеров

9 голосов
/ 11 января 2010

Это выражение инициализатора , которое устанавливает для первого поля W значение sizeof(Wininfo), а для других полей - ноль.

5 голосов
/ 11 января 2010

Во-первых, это не утверждение, это объявление. Объявления не являются заявлениями в C.

Во-вторых, часть = { /* whatever */ } является инициализатором - она ​​определяет начальное значение объекта. Обычно вы используете инициализаторы, заключенные в {}, для инициализации агрегатных объектов: массивов или структур. Однако малоизвестная особенность языка Си состоит в том, что инициализаторы скалярных объектов также могут быть необязательно заключены в {}, как в

int i = { 5 };

Что именно означает ваше конкретное объявление, зависит от типа Wininfo. Если W является агрегатом, то его первый член инициализируется значением sizeof(Wininfo), а остальные инициализируются нулями. Если W является скаляром, то он просто получает начальное значение sizeof(Wininfo).

...