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

Я видел это в каком-то коде C:

Wininfo W = { sizeof(Wininfo) };

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


person Paul Reiners    schedule 11.01.2010    source источник


Ответы (3)


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

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

См. также Инициализация структуры языка программирования C/C++? Примеры

person Ruben Bartelink    schedule 11.01.2010

Это выражение инициализации, которое устанавливает первое поле W в sizeof(Wininfo), а остальные поля равны нулю.

person sth    schedule 11.01.2010
comment
+1 (и украл большую часть ответа, чтобы сделать мой менее неполным: P) - person Ruben Bartelink; 11.01.2010

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

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

int i = { 5 };

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

person AnT    schedule 11.01.2010
comment
Поскольку он включает инициализатор, это не просто объявление, а определение. - person Jerry Coffin; 11.01.2010
comment
Определение всегда является декларацией. Таким образом, в контексте, когда различие не имеет значения, обычно используется термин декларация. Синтаксический элемент всегда называется объявлением. Определения существуют только на уровне семантики. - person AnT; 11.01.2010
comment
+1: Красиво и полно (@nos: это то, на что я намекал, говоря об избыточности) - person Ruben Bartelink; 11.01.2010