1

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

[编辑]

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

4

1 回答 1

2

允许有很多宏。为什么这让你感到困扰?

像这样的宏

 #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]; \
    }

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

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

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

于 2013-04-20T06:19:27.737 回答