3

我从 Linux 内核源代码中的 linux/kfifo.h 文件中找到了以下代码。

/**
 * kfifo_init - initialize a fifo using a preallocated buffer
 * @fifo: the fifo to assign the buffer
 * @buffer: the preallocated buffer to be used
 * @size: the size of the internal buffer, this have to be a power of 2
 *
 * This macro initialize a fifo using a preallocated buffer.
 *
 * The numer of elements will be rounded-up to a power of 2.
 * Return 0 if no error, otherwise an error code.
 */
#define kfifo_init(fifo, buffer, size) \
({ \
    typeof((fifo) + 1) __tmp = (fifo); \
    struct __kfifo *__kfifo = &__tmp->kfifo; \
    __is_kfifo_ptr(__tmp) ? \
    __kfifo_init(__kfifo, buffer, size, sizeof(*__tmp->type)) : \
    -EINVAL; \
})

从这段代码中,“typeof((fifo) + 1)”是什么意思?为什么不使用 'typeof(fifo) __tmpl = (fifo);'

4

1 回答 1

4

@Wonil您的第一个假设是正确的。此构造用于检查是否将指针用作参数。

当给出一个普通的结构时,表达式将引发编译器错误,因为结构用于一元 + 和一个 int。

当给出一个指针时,二进制 + 将向它添加 1,这仍然是指向相同类型的指针,并且表达式在语法上是正确的。

于 2013-09-27T08:22:38.290 回答