【问题标题】:C 是否有 JavaScript “this” 的版本?
【发布时间】:2022-01-20 18:15:51
【问题描述】:

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

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

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

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

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 中创建一个使用自引用的删除函数,如果没有,在大多数用户中删除结构的最语义正确的方法是什么友好的方式?

【问题讨论】:

  • 没有。 C 没有类。为此,我们有 C++。所以 struct 中没有函数,也没有“this”。
  • C 不会将任何隐式参数传递给函数,如果你想要一个 this 那么它需要显式传递
  • @charlie-map 为什么选择 C ​​来解决这个问题?
  • @Heto 您绝对可以通过使用函数pointers 在结构中拥有函数。我怀疑会有一个“this”,但是我想知道用显式传入来编写对 UI 友好的东西的最佳方式。
  • “UI 友好”是什么意思?

标签: c struct this


【解决方案1】:

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

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

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

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

【讨论】:

  • 正确 - 我不想在结构内部定义函数。我想知道是否有一种方法可以通过附加在所述结构内部的函数(使用指针)来删除结构。我假设我必须做myStruct.delete(myStruct);,但我希望在简单易用方面更友好一些。
  • 但是您可以将函数指针存储在 C struct 中,也可以用另一个指针模拟 this 关键字。
  • 哦有趣的@InnocentBystander。我理论上可以在结构本身内部存储一个指向结构的指针吗?我仍然不确定我是否可以在我指向的函数中访问该结构指针
  • @charlie-map:不要这样做,以正确的方式使用正确的工具。你想要 OOP,用 C++ 来做。你想要它在 C 中,用 C 方式(程序)来做。
  • @charlie - 如果你在结构中存储一个指针,你很快就会复制结构,然后指针指向错误的结构......
【解决方案2】:

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

struct Storage {
    /* Some definitions here */
}

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

    free(someStructure);
}

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

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 2023-02-04
    • 2014-05-25
    • 2011-05-07
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2011-05-13
    相关资源
    最近更新 更多