代码之家  ›  专栏  ›  技术社区  ›  charlie-map

C有JavaScript“this”的版本吗?

  •  1
  • charlie-map  · 技术社区  · 4 年前

    到目前为止,我已经使用了相当多的JavaScript。如果要在JavaScript中使用对象构造函数,则可以访问 this 建造师。

    因此,我的问题是试图在C中使用类似的概念。我创建了一个结构,我希望能够自我引用:

    struct Storage {
        void (*delete)();
    }
    

    所以如果我要分配一个 Storage 课程:

    struct Storage *myStruct = malloc(sizeof(struct Storage));
    

    假设我正在尝试删除 myStruct .如果我有 delete 我所指的函数 myStruct->delete = deleteStructure ),我想这样做:

    myStruct.delete();
    

    那会怎么样 free() 通过所述结构内部的自引用变量 删去 作用我想知道有没有办法 删去 函数看起来像:

    void deleteStructure() {
        free( /* "this" or some equivalent C self-reference */ );
    }
    

    根据目前的研究,我认为这是不可能的,因为 这 通常仅在面向对象编程语言中使用。如果这不可能,我想知道语义上正确的方法是什么。我希望能充分利用这一点 删去 从用户界面的角度来看,功能相当简单。我理解这一点的唯一方法是传递对结构的引用,如:

    void deleteStructure(struct Storage *someStructure) {
        free(someStructure);
    }
    

    然后需要按如下方式进行删除:

    deleteStructure(myStruct);
    

    总而言之: 有没有一种方法可以使delete函数在C语言中使用自引用,如果没有,那么在语义上最正确的方法是什么,以最用户友好的方式删除一个结构?

    1 回复  |  直到 4 年前
        1
  •  4
  •   mrks    4 年前

    不可以。你甚至不能为结构定义函数。

    struct Storage {
        void (*delete)();
    }
    

    只存储一个指向void函数的指针。那可能是 任何 void函数,当调用它时,它与 Storage 不管怎样

    还要注意,在代码中,结构的每个实例都存储一个指向void函数的指针。您可以对它们进行初始化,使它们都指向同一个函数,在这种情况下,每个实例只需浪费64位,没有任何实际好处。您还可以让它们指向具有不同语义的完全不同的函数。

        2
  •  1
  •   charlie-map    4 年前

    根据@UnholySheep的评论,连接到C函数的结构的正确语义用法将遵循以下结构:

    struct Storage {
        /* Some definitions here */
    }
    
    void deleteStructure(struct Storage *someStructure) {
        free( /* all inner structure allocations */ );
    
        free(someStructure);
    }
    

    Here's 更多关于通过引用传递结构的信息。