此字段位于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; \
}
关于该联合的信息较少。那么Rectype和Recsize的目的是什么?
MARK:有人可以提供有关该工会的参考资料吗?谢谢。
答案 0 :(得分:0)
这是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
变量。
我必须承认,我对Linux内核编程一无所知–这就是我从这段代码中所读的内容(以及它的意义)。
关于
char (*rectype)[recsize];
rectype
是指向char[recsize]
的指针。
为什么要加上括号(()
)?:它们是必需的,因为如果缺少括号,这将是另一种(非预期的)类型:
char *rectype[recsize];
是包含char*
个元素的recsize
数组。
因此,指向数组的指针与指向指针的数组,因此是括号。
recsize
是宏参数之一。恕我直言,它必须专门使用恒定的整数值。否则,可能是一个错误。 (工会中的VLA?不,那是行不通的。)
最后提示如何解码混淆的C类型:
如有疑问,请尝试cdecl: C gibberish ⇆ English。使用recsize
无效,但用提供的数字替换recsize
:
char (*rectype)[10];
declare rectype as pointer to array 10 of char
发送完此答案后,出于好奇,我用Google搜索了c pointer to array site:stackoverflow.com,发现了
SO: C pointer to array/array of pointers disambiguation
作为首个热门歌曲,可能对进一步阅读很有帮助。