sizeof(int [1])是什么意思?

时间:2013-02-18 10:34:11

标签: c macros linux-kernel sizeof

我是Linux内核的新手。我正在阅读文件ioctl.h,在那里我遇到了一个宏 _IOC_TYPECHECK(t),如下所示:

#define _IOC_TYPECHECK(t) \
        ((sizeof(t) == sizeof(t[1]) && \
          sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
          sizeof(t) : __invalid_size_argument_for_IOC)

你能解释一下这段代码吗?在此代码中,sizeof(t[1])的含义是什么?

2 个答案:

答案 0 :(得分:8)

这用于检查第三个参数对_IOR / _IOW / _IOWR宏的有效性,该宏应该是一个类型。它检查参数实际上是一个类型(而不是变量或数字),否则会导致编译器或链接器错误。

  • 如果t是一种类型,则t[1]类型为“1 t的数组”。此类型与t的大小相同,因此sizeof(t) == sizeof(t[1])为真。

  • 如果t是一个数字,sizeof(t)将无法编译。

  • 如果t是一个简单(非数组)变量,则t[1]将导致编译器错误。

  • 如果t是数组变量,sizeof(t) == sizeof(t[1])将为false,并且将导致链接器错误(因为未定义__invalid_size_argument_for_IOC)。

    < / LI>

表达式sizeof(t) < (1 << _IOC_SIZEBITS)检查类型t的大小是否超过ioctl允许的最大值,否则会导致相同的链接器错误。

还有一些无效的情况不会被这个宏捕获 - 例如,当t是指向指针的指针时。

答案 1 :(得分:3)

它与sizeof的所有其他用途相同。它计算表达式的大小。

在这种特殊情况下,我怀疑检查是为了确保t的一些属性(应该是一个类型名,而不是一个变量),我从上下文中不知道...也许可以将它视为指针(数组索引所需),这将排除某些类型。宏观旁边的评论说/* provoke compile error for invalid uses of size argument */似乎支持这一理论。

请注意sizeof是一个运算符,而不是一个函数。除非您想直接计算类型的大小,然后它们是表达式的一部分(它是一个强制转换表达式),否则不需要括号。因此,为了清楚起见,可以写sizeof t == sizeof t[1] && ...(sizeof t == sizeof t[1])

这是一个非常好用的样式,因为它将计算的大小“锁定”到正确的数组,而不是重复t的类型。因此,如果类型要改变,表达式将自动适应并仍然计算正确的东西。

由于某种原因,许多C程序员似乎更喜欢在所有情况下围绕sizeof的参数括号。