sizeof(int )是什么意思?
我是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])
是什么意思?
这用于检查第三个参数对_IOR
/ _IOW
/ _IOWR
宏的有效性,该宏应该是一个类型。 它检查参数实际上是一个类型(而不是变量或数字),否则会导致编译器或链接器错误。
-
如果
t
是一个类型,则t[1]
是“1t
的数组”类型。 此类型与t
具有相同的大小,因此sizeof(t) == sizeof(t[1])
为真。 -
如果
t
是数字,则sizeof(t)
将无法编译。 -
如果
t
是一个简单(非数组)变量,则t[1]
将导致编译器错误。 -
如果
t
是数组变量,则sizeof(t) == sizeof(t[1])
将为false,并且将导致链接器错误(因为__invalid_size_argument_for_IOC
)。
表达式sizeof(t) < (1 << _IOC_SIZEBITS)
检查类型t
的大小是否超过ioctl
允许的最大值,否则会导致相同的链接器错误。
还有一些无效的情况不会被这个宏捕获 - 例如,当t
是指向指针的指针时。
它与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
的参数括号。