Какова цель 'rectype' в '__STRUCT_KFIFO_COMMON'?Как мне понять этот макрос? - PullRequest
0 голосов
/ 30 ноября 2018

Это поле находится в linux-4.16.12 \ include \ linux \ kfifo.h:

#define __STRUCT_KFIFO_COMMON(datatype, recsize, ptrtype) \
    union { \
        struct __kfifo  kfifo; \
        datatype    *type; \
        const datatype  *const_type; \
        char        (*rectype)[recsize];\
        ptrtype     *ptr; \
        ptrtype const   *ptr_const; \
    }

Меньше информации об этом объединении.Так, какова цель использования ректипа и размера?

МАРК: Может ли кто-нибудь предоставить справочный материал об этом союзе?благодарю вас.

1 Ответ

0 голосов
/ 30 ноября 2018

Это «метапрограммирование» на C - извините, я шучу.

#define __STRUCT_KFIFO_COMMON(datatype, recsize, ptrtype) - это макрос для определения union.

. Он может использоваться длялюбое объявление, например

typedef __STRUCT_KFIFO_COMMON(int, 64, int*) IntFiFo;

для определения типа union (псевдоним) или

static __STRUCT_KFIFO_COMMON(int, 64, int*) intFiFo;

для объявления переменной static.

IДолжен признать, что я ничего не знаю о программировании ядра Linux - это именно то, что я прочитал из этого кода (и как это будет иметь смысл).

Относительно

char        (*rectype)[recsize];

rectypeуказатель на char[recsize].

Почему круглые скобки (()) ?: Они необходимы, потому что в случае пропуска это будет другой (не предназначенный) тип:

char        *rectype[recsize];

является массивом char* с recsize элементами.

Итак, указатель на массив против массива указателей, следовательно, круглые скобки.

recsize является одним из параметров макроса,ИМХО, он должен использоваться исключительно с постоянным интегральным значением.В противном случае, это, вероятно, ошибка.(VLA в союзе? Нет, это не работает.)

Последний совет о том, как декодировать запутанные типы C:

Попробуйте cdecl: C gibberish ⇆ Английский если сомневаешься.С recsize он не работал, но заменил recsize на число, которое он предоставил:

char (*rectype)[10];

    declare rectype as pointer to array 10 of char

После отправки этого ответа я прогуглил указатель c на сайт массива: stackoverflow.com из любопытства и нашел

SO: C указатель на массив / массив устранения неоднозначности указателей

в качестве первого попадания, что может быть интересно для дальнейшего чтения.

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