在vnode上进行转换操作(在NetBSD中)

时间:2015-10-03 19:39:35

标签: c linux unix kernel netbsd

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

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

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 ?

通常,这些操作的第一行执行将vnode指针(实际上是void *)分配到此参数类型指针的指针中。例如,我们执行以下操作:

mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe

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

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

1 个答案:

答案 0 :(得分:4)

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

引用" C编程语言2 nd Edition"由K& R:

  

任何指向对象的指针都可以转换为void *类型而不会丢失信息。如果   结果被转换回原始指针类型,原始指针被恢复。不像   参数A.6.6中讨论的指针到指针转换,通常需要显式   可以为类型void *的指针分配指针,并且可以对指针进行比较   和他们一起。

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

  

void *指针的这种解释是新的;以前,char *指针起了作用   通用指针。 ANSI标准特别祝福void *指针与对象的会面   指派和关系中的指针,同时要求显式转换其他指针混合。