什么是'typeof((fifo)+ 1)'来自linux / kfifo.h文件?

时间:2013-04-24 15:46:09

标签: gcc linux-kernel

我在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);'

1 个答案:

答案 0 :(得分:4)

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

当给出一个普通的结构时,该表达式将引发编译器错误,因为结构在带有int的一元+中使用。

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