代码是:
#define O_ACCMODE 00000003
#define ACC_MODE(x) ("\000\004\002\006"[(x)&O_ACCMODE])
如何理解?
谢谢。
答案 0 :(得分:4)
"\000\004\002\006"
定义了4个字节/字符的数组,我们可以将其替换为:
char array[4] = {0, 4, 2, 6};
x& 3表示 - 在整数中只得到最右边的2位,基本上等于x%4
所以,这个宏做:array[ x % 4 ]
- 根据索引
答案 1 :(得分:3)
宏实现了函数
(x % 4) == 0 --> (char)0
(x % 4) == 1 --> (char)4
(x % 4) == 2 --> (char)2
(x % 4) == 3 --> (char)6
它使用按位和运算来使x
中的所有位无效,除了两个最低有效位(这相当于x%4)。然后使用result作为索引从char数组中提取值。
等效代码是
char ACC_MODES[] = {'\000', '\004', '\002', '\006'} // array of 4 chars
#define O_ACCMODE 00000003
#define USE_LOWEST_TWO_BITS(x) ((x)&O_ACCMODE) // masks (that is sets to zero) all bits except two lest significant, the equivalent operation is (x % 4)
#define ACC_MODE(x) (ACC_MODES[USE_LOWEST_TWO_BITS(x)])