Что означает структура, заключенная в фигурные скобки? - PullRequest
2 голосов
/ 02 марта 2020

Недавно я отслеживаю некоторый исходный код. Я застрял, когда увидел следующий макрос.

#define tmp(x)                                          \
((void) ((struct {                                     \
     _Static_assert(sizeof(x) <= 16, "Err"); \
     int dum;                                        \
 }){1})

Этот макрос предназначен для проверки того, что размер x меньше 16.

У меня два вопроса об этом макросе.

Во-первых, что такое struct в значении следующего формата, имеет ли этот стиль ключевое слово?

(struct {                       
     .......                                      
 }){1};

Во-вторых, почему он помещает assert внутри struct? Почему бы просто не позвонить _Static_assert на главную?

1 Ответ

4 голосов
/ 02 марта 2020

Это "объявление и инициализация в скобках" называется составным литералом . Эта функция синтаксиса впервые появилась в 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);
}

Не знаю, зачем это нужно, но, по крайней мере, это сделано доступно автору этого макроса для случая, когда он может понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...