Linux 内核中变量名后 *const* 的扭曲用法

Twisted usage of *const* after variable name in Linux kernel

谁能解释一下下面代码中实际定义了什么,以及最后的const是什么?是否创建了名为 __user 的变量和类型为 __user 的指针 __argv

const char __user *const __user *__argv

我熟悉放置const(使pointer/data不可修改)的可能性,但我从未想过上述可能性

该片段来自内核中的函数声明:

1593 int do_execve(const char *filename,
1594         const char __user *const __user *__argv,
1595         const char __user *const __user *__envp,
1596         struct pt_regs *regs)

编辑:如果我之前知道 __user 宏,我可能不会问这个问题。尽管如此,它并不完全是 this 的副本,因为那里没有讨论定义变量的实际类型。

实际上,__user是一个提供一些属性的宏(更多关于这个here)。所以,这个变量被命名为__argv,它的类型是pointer to const pointer to const char.

const T *pT const *pp 声明为指向 const T.

的指针

T * const pp 声明为指向 T.

const 指针

const T * const pT const * const p 都将 p 声明为指向 const Tconst 指针。