宏定义中的奇怪语法[C]

时间:2015-05-21 15:39:26

标签: c macros driver

我是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)的确切含义吗?

谢谢!

2 个答案:

答案 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指出它似乎与我的意思相矛盾。

相关问题