kfifo.h几乎完全由#define
组成。这是为什么?为什么他们没有像在“正常”中那样在h文件中声明函数。
[编辑]
似乎我的问题很容易被解释为对实施的质疑,而不是我要问的问题,从学习的角度来看,为什么这种实施更好。无论如何,因为我不知道我在看“函数式宏”我投票结束,因为它显然是重复的。
答案 0 :(得分: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]
size
,将扩展为等同于数组3
的声明,这将使编译器大喊大叫。 (最近的C ++ 2011标准也有static_assert
用于此类目的。)
所以我不明白为什么你会感到惊讶。 C 预处理器很有用(恕我直言,它甚至不够强大)。为什么要避免使用它?
这是免费软件;如果您不喜欢该源文件,您可以努力改进它(这需要时间)来提出更好的解决方案。我喜欢当前的那个。