Я видел это в какой-то код C:C код с участием {}
Wininfo W = { sizeof(Wininfo) };
Какого черта это значит?
Я видел это в какой-то код C:C код с участием {}
Wininfo W = { sizeof(Wininfo) };
Какого черта это значит?
Этот код инициализирует 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? для родственных примеров
Это initializer expression, который задает первое поле W
к sizeof(Wininfo)
и другие поля к нулю.
Во-первых, это не утверждение, это заявление. Объявления не являются инструкциями в C.
Во-вторых, часть = { /* whatever */ }
является инициализатором - он определяет начальное значение объекта. Обычно вы используете инициализаторы, заключенные в {}
, чтобы инициализировать агрегированные объекты: массивы или структуры. Тем не менее, малоизвестная особенность C языка является то, что Инициализаторы скалярных объектов также могут быть дополнительно заключены в {}
, как в
int i = { 5 };
Что именно ваша конкретная декларация означает, зависит от того, что Wininfo
типа. Если W
является агрегатом, то его первый член инициализируется значением sizeof(Wininfo)
, а остальное инициализируется нулями. Если W
является скаляром, то он просто получает начальное значение sizeof(Wininfo)
.
Так как он включает инициализатор, это не просто декларация, а определение. –
Определение всегда является декларацией. Таким образом, это контексты, когда различие не имеет значения, обычно используется термин * декларация *. Синтаксический элемент всегда называется * declaration *. Определения существуют только на уровне семантики. – AnT
+1: Ницца и полная (@nos: это то, над чем я стрелял, когда упоминал избыточность) –
+1 (и украл большую часть ответа, чтобы сделать мой намного менее незавершенным: P) –