我很想知道在以下赋值操作中对filpx指针使用括号的情况:

#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);

我不能,但是我敢打赌,类似的例子也可以在影片中找到,或者至少你永远不确定。

10-08 20:28