Jho*_*epp 9 c macros sizeof linux-kernel
我是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)
Run Code Online (Sandbox Code Playgroud)
你能解释一下这段代码吗?在这段代码中,什么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是指向指针的指针.