C有没有JavaScript"this"的版本?

Does C have a version of JavaScript "this"?

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

所以我的问题与尝试在 C 中使用类似的概念有关。我创建了一个我希望能够自我引用的结构:

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

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

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

假设我正在尝试删除 myStruct。如果我有一些我指向的 delete 函数(使用 myStruct->delete = deleteStructure),我想做这样的事情:

myStruct.delete();

然后 free() 通过所述 delete 函数内部的自引用变量的结构。我想知道是否有办法让 delete 函数看起来像:

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

我目前的研究假设是这是不可能的,因为 this 通常只在面向对象的编程语言中使用。如果这不可能,我想知道在语义上正确的方法是什么。我希望从用户界面的角度来看,这个 delete 功能的使用相当简单。我理解这个工作的唯一方法是传递对结构的引用,如:

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

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

deleteStructure(myStruct);

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

没有。您甚至不能为结构定义函数。

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

只是存储了一个指向void函数的指针。这可能是 any void 函数,当它被调用时,它与 Storage 没有任何联系。

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

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

struct Storage {
    /* Some definitions here */
}

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

    free(someStructure);
}

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