Это «метапрограммирование» на 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 указатель на массив / массив устранения неоднозначности указателей
в качестве первого попадания, что может быть интересно для дальнейшего чтения.