我很想知道在以下赋值操作中对filp
和x
指针使用括号的情况:
#define init_sync_kiocb(x, filp) \
do { \
struct task_struct *tsk = current; \
(x)->ki_flags = 0; \
(x)->ki_users = 1; \
(x)->ki_key = KIOCB_SYNC_KEY; \
(x)->ki_filp = (filp); \ // This line here
....
....
资源:
https://github.com/gp-b2g/gp-peak-kernel/blob/master/include/linux/aio.h#L135
最佳答案
这些在宏定义中使用,该宏定义由预处理器作为文本替换来处理。它是文本替换的事实可能导致怪异的表达式。考虑:
p = &a_struct_array[10];
init_sync_kiocb(p + 20, filp)
没有括号,它变成:
p + 20->ki_filp = (filp);
与括号:
(p + 20)->ki_filp = (filp);
我不能,但是我敢打赌,类似的例子也可以在影片中找到,或者至少你永远不确定。