我在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);'
答案 0 :(得分:4)
@Wonil你的第一个假设是正确的。此构造用于检查指针是否用作参数。
当给出一个普通的结构时,该表达式将引发编译器错误,因为结构在带有int的一元+中使用。
当给出指针时,二进制+将向它添加1,它仍然是指向相同类型的指针,表达式在语法上是正确的。