繁体   English   中英

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

[英]What does sizeof(int[1]) mean?

我是 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]是“一个 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未定义)。

表达式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的参数加上括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM