gpt4 book ai didi

vnode 上的转换操作(在 NetBSD 中)

转载 作者:太空狗 更新时间:2023-10-29 11:43:18 24 4
gpt4 key购买 nike

在 NetBSD 系统文件 usr/src/sys/sys/vnode.h 中定义了一个 vnode 的结构。但是,我看到有时在执行操作时(比如说 ufs_getattr),一个 vnode* 作为 void* 传递给被调用的操作。

每个这样的操作都有其参数结构。对于Ex,ufs_getattr()的结构如下:

struct vop_getattr_args /* {
struct vnode *a_vp;
struct vattr *a_vap;
kauth_cred_t a_cred;
};

通常,这些操作的第一行执行将 vnode 指针(实际上是 void*)赋值到此参数类型指针的指针中。例如,我们做类似的事情:

int
ufs_getattr(void *v)
{
struct vop_getattr_args /* {
struct vnode *a_vp;
struct vattr *a_vap;
kauth_cred_t a_cred;
} */ *ap = v; //why this is okay to do ?
struct vnode *vp;
struct inode *ip;
struct vattr *vap;

vp = ap->a_vp; //wont this break ?

从usr/src/sys/ufs/ufs/ufs_vnops.c中提取

由于 C 编程知识很少,我无法证明这种不匹配的赋值是正确的,因为类型并不真正匹配。

最佳答案

在 C 中,将 void* 分配给 T* 是合法的(在 C++ 中不是)。因此代码完全有效。

引用 K&R 的“The C Programming Language 2nd Edition”:

Any pointer to an object may be converted to type void * without loss of information. If the result is converted back to the original pointer type, the original pointer is recovered. Unlike the pointer-to-pointer conversions discussed in Par.A.6.6, which generally require an explicit cast, pointers may be assigned to and from pointers of type void *, and may be compared with them.


作为一个有趣的旁注,关于 void* 的历史(来自同一本书):

This interpretation of void * pointers is new; previously, char * pointers played the role of generic pointer. The ANSI standard specifically blesses the meeting of void * pointers with object pointers in assignments and relationals, while requiring explicit casts for other pointer mixtures.

关于vnode 上的转换操作(在 NetBSD 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32926716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com