我是C的新手,目前正在阅读我必须改变的驱动程序代码。我遇到了一面文字墙,上面写着:
#define IOCTL_AIO ('i'<<8)
#define AIO_IOCTL_REG_READ (IOCTL_AIO|0)
#define AIO_IOCTL_REG_WRITE (IOCTL_AIO|1)
...
我知道这些用于宏,但我不理解(IOCTL|0)
的语法。这些宏稍后会在switch:case
中使用,如果这会改变任何内容。
有人会解释语法(IOCTL_AIO|0)
的确切含义吗?
谢谢!
答案 0 :(得分:3)
#define AIO_IOCTL_REG_READ (IOCTL_AIO|0)
与
相同#define AIO_IOCTL_REG_READ IOCTL_AIO
我怀疑第一种形式是用来使它与它后面的宏在视觉上保持一致。
答案 1 :(得分:1)
谢谢大家的帮助!虽然(Command|Subcommand)
格式对我有意义,但它最终并不完全符合我的想法。
我做了一些测试,格式为:
int i = ( # | # );
printf("%i", i);
看到这个设置的输出后,我看了一下,发现发生了什么;这两个数字是用二进制算术处理的,即按位OR。
这需要两个输入,A和B,并输出C.例如:
A = 100101101
B = 010001000
---------------
C = 110101101
A和B需要每个位,并执行OR以获得C的输出位。
这就是实际发生的事情:
AIO_IOCTL [26880] = 110100100000000
Command [31] = 11111
-----------------------------------
Macro [26911] = 110100100011111
编辑: 重述介绍,@ mtijanic指出它似乎与我的意思相矛盾。