2010-01-11 4 views

ответ

15

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

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

Смотрите также Struct initialization of the C/C++ programming language? для родственных примеров

9

Это initializer expression, который задает первое поле W к sizeof(Wininfo) и другие поля к нулю.

+0

+1 (и украл большую часть ответа, чтобы сделать мой намного менее незавершенным: P) –

5

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

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

int i = { 5 }; 

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

+0

Так как он включает инициализатор, это не просто декларация, а определение. –

+0

Определение всегда является декларацией. Таким образом, это контексты, когда различие не имеет значения, обычно используется термин * декларация *. Синтаксический элемент всегда называется * declaration *. Определения существуют только на уровне семантики. – AnT

+0

+1: Ницца и полная (@nos: это то, над чем я стрелял, когда упоминал избыточность) –

Смежные вопросы