'__STRUCT_KFIFO_COMMON'中'rectype'的目的是什么?我应该如何看待这个宏?

时间:2018-11-30 03:00:16

标签: c linux linux-kernel

此字段位于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:有人可以提供有关该工会的参考资料吗?谢谢。

1 个答案:

答案 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

作为首个热门歌曲,可能对进一步阅读很有帮助。