Это "объявление и инициализация в скобках" называется составным литералом . Эта функция синтаксиса впервые появилась в C99. Его основной синтаксис c:
( type ) { initializer-list }
Итак, если вы пропустите _Static_cast
, вы получите (struct { int dum; }){1}
, который объявляет безымянную структуру и создает составной литерал с этой структурой, содержащей dum==1
. Тип, приведенный к void
, просто отбрасывает значение, избегая возможного предупреждения о «неиспользованном значении».
Во-вторых, почему он помещает assert в struct? Почему бы просто не позвонить _Static_assert
в основном?
Если вы заметили, это расширяется до чего-то, что не заканчивается точкой с запятой ;
. (Я предполагаю, что отсутствующая закрывающая скобка )
является вашей ошибкой копирования-вставки.) Таким образом, она может быть использована как подвыражение, например
#define tmp(x) \
((void) ((struct { \
_Static_assert(sizeof(x) <= 16, "Err"); \
int dum; \
}){1}))
#include <stdio.h>
int main()
{
const int x=324;
const double y=(tmp(x), 23.342);
printf("%g\n", y);
}
Не знаю, зачем это нужно, но, по крайней мере, это сделано доступно автору этого макроса для случая, когда он может понадобиться.