c - 为什么 kfifo.h 充满了#define 语句

标签 c linux-kernel

<分区>

kfifo.h几乎完全由 #define 组成。这是为什么?为什么他们没有像“正常”完成的那样在 h 文件中声明函数。

[编辑]

似乎我的问题很容易被解释为对实现的质疑,而不是我想问的问题,从学习的角度来看,为什么这个实现更好。无论如何,因为我不知道我在看“类似函数的宏”,所以我投票结束,因为它显然是重复的。

最佳答案

允许有很多宏。为什么这会困扰您?

像这样的宏

 #define STRUCT_KFIFO_PTR(type) \
   struct __STRUCT_KFIFO_PTR(type, 0, type)

不是类似函数的宏。

像这样的宏

 #define kfifo_initialized(fifo) ((fifo)->kfifo.mask)

也可以用在某些作业的左侧(即使您可能不应该这样做)。而且比对应的inline函数写起来更短

 static inline unsigned kfifo_initialezed_f(struct __kfifo *fifo) {
    return fifo->kfifo.mask;
 }

更重要的是,宏 kfifo_initialized 将与其 fifo 实参的多个不同声明一起工作(它在某种有限的意义上是“通用的”)。

像这样的宏

 #define __STRUCT_KFIFO(type, size, recsize, ptrtype) \
    { \
   __STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \
        type    buf[((size < 2) || (size & (size - 1))) ? -1 : size]; \
    }

如果给定 3size 将扩展为等效于数组 buf[-1] 的声明,这将使编译器叫喊。 (最近的 C++2011 标准也有用于此类目的的 static_assert)。

所以我不明白你为什么感到惊讶。 C 预处理器很有用(恕我直言,它甚至还不够强大)。为什么要避免使用它?

这是免费软件;如果您不喜欢该源文件,您可以努力改进它(这需要时间)以提出更好的解决方案。我喜欢现在的。

关于c - 为什么 kfifo.h 充满了#define 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16117304/

相关文章:

c - 读取使用 malloc 创建的二维数组的输入

c++ - C/C++ 控制CPU使用率

c - scanf 终止标准输入

c - 内核模块中的 rand() 和 sleep() 是如何制作的?

linux-kernel - 谁在 Linux 上调用 delay_tsc()

c - LPSTREAM 将整个 Stream 内容读入 unsigned char* 数组

c - C 中的重复数字序列

linux-kernel - sysfs 属性可以在 Linux 设备驱动程序中采用非数值吗?

c - 如何在Linux内核中打开并读取 `struct inode *`处的文件

c - 为什么 Linux 内核模块符号不能正确地全局导出?