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 更多关于通过引用传递结构的信息。
到目前为止,我已经使用了相当多的 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 更多关于通过引用传递结构的信息。