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

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

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

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

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