Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么kfifo.h中充满了define语句_C_Linux Kernel - Fatal编程技术网

C 为什么kfifo.h中充满了define语句

C 为什么kfifo.h中充满了define语句,c,linux-kernel,C,Linux Kernel,几乎全部由#define组成。为什么呢?为什么他们没有像“正常”那样声明h文件中的函数呢 [编辑] 似乎我的问题很容易被解释为对实现的质疑,而不是我想问的问题,从学习的角度来看,为什么这个实现更好。不管怎样,因为我不知道我在看“函数式宏”,我投票决定关闭它,因为它显然是重复的。允许有很多宏。为什么这会困扰你 类宏 #define STRUCT_KFIFO_PTR(type) \ struct __STRUCT_KFIFO_PTR(type, 0, type) #define kfif

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

[编辑]


似乎我的问题很容易被解释为对实现的质疑,而不是我想问的问题,从学习的角度来看,为什么这个实现更好。不管怎样,因为我不知道我在看“函数式宏”,我投票决定关闭它,因为它显然是重复的。

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

类宏

 #define STRUCT_KFIFO_PTR(type) \
   struct __STRUCT_KFIFO_PTR(type, 0, type)
 #define kfifo_initialized(fifo) ((fifo)->kfifo.mask)
不是像宏那样的函数

类宏

 #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]; \
    }
\define\uuuu STRUCT\ukfifo(type、size、recsize、ptrtype)\
{ \
__STRUCT_KFIFO_COMMON(type、recsize、ptrtype)\
buf型[(尺寸<2)| |(尺寸和尺寸-1))?-1:尺寸]\
}
如果给定
大小
3
,则将扩展为一个相当于数组
buf[-1]
的声明,这将使编译器大喊大叫。(最新的C++2011标准也有
静态断言
用于此目的)

所以我不明白你为什么感到惊讶。C预处理器很有用(尽管它还不够强大)。为什么要避免使用它


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

为什么不呢?那里的许多宏都不能表示为C函数……“这是为什么?”-可能是因为Torvalds先生把它们放进了?@H2CO3这有什么帮助?嗯,它不是真正的复制品。正如所指出的,函数和数据都用在这个标题中<代码>宏
有一些缺点,但在这里它们强制执行一些数据大小,这使得结构在某些情况下可以自由锁定。它与引用的副本完全不同。事实上,这是一个环形缓冲区,包含一些有趣的算法细节。这样的算法在一段时间内是无锁的,唐纳德·克努斯(Donald Knuth)在《计算艺术》(art of computing)中对其进行了记录。不幸的是,问题已经结束,因此无法补充回答为什么它在这里特别有用。此外,引用的副本指的是类似于宏的函数。他们看起来像是C函数。谁说受伤了?我想知道是为了学习。我真的不明白你的严厉语气。有38k代表的人一定在某个时候读过关于礼仪的常见问题。嗯,我不是以英语为母语的人(而且大多数法国人的英语很差,比大多数瑞典人差得多)。我不认为“被伤害”是侵略性的(通常不是,特别是对于“感觉”,根据定义是主观的)。我试着稍微改进一下我的措辞,不用担心。我想我的问题也很容易被忽略。我的意图是询问为什么这种实现方式比“正常”方式更好,而不是质疑实现本身。是的,
STRUCT\u KFIFO\u PTR
是一种“类似于宏的函数”。C标准定义了两种类型的宏“类对象”宏(不带参数)和“类函数”宏(带参数)。名字“类函数并不意味着它们的行为类似于函数,只是它们的参数语法类似于函数调用。@KeithThompson我相信人们混淆了类函数的符号。引用的副本使用宏作为函数替换。标准可以使用其他语言。并不是每个人都生活和呼吸标准文件;如果自然语言是明确的,可能是有用的;-)