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 *p
和 T const *p
将 p
声明为指向 const T
.
的指针
T * const p
将 p
声明为指向 T
.
的 const
指针
const T * const p
和 T const * const p
都将 p
声明为指向 const T
的 const
指针。
谁能解释一下下面代码中实际定义了什么,以及最后的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 *p
和 T const *p
将 p
声明为指向 const T
.
T * const p
将 p
声明为指向 T
.
const
指针
const T * const p
和 T const * const p
都将 p
声明为指向 const T
的 const
指针。