我对打算在C内部使用的对象特别感兴趣,这与构成诸如python这样的解释语言的核心的对象的实现相反。

最佳答案

我倾向于做这样的事情:

struct foo_ops {
    void (*blah)(struct foo *, ...);
    void (*plugh)(struct foo *, ...);
};
struct foo {
    struct foo_ops *ops;
    /* data fields for foo go here */
};

通过这些结构定义,实现foo的代码如下所示:
static void plugh(struct foo *, ...) { ... }
static void blah(struct foo *, ...) { ... }

static struct foo_ops foo_ops = { blah, plugh };

struct foo *new_foo(...) {
   struct foo *foop = malloc(sizeof(*foop));
   foop->ops = &foo_ops;
   /* fill in rest of *foop */
   return foop;
}

然后,在使用foo的代码中:
struct foo *foop = new_foo(...);
foop->ops->blah(foop, ...);
foop->ops->plugh(foop, ...);

可以使用宏或内联函数整理此代码,使其看起来更像C
foo_blah(foop, ...);
foo_plugh(foop, ...);

尽管如果您在“ops”字段中使用合理的简称,那么简单地写出最初显示的代码并不是特别冗长。

该技术完全可以用C实现相对简单的基于对象的设计,但是它不能处理更高级的要求,例如显式表示类和方法继承。对于这些,您可能需要类似GObject的工具(如EFraim所述),但是我建议您确保确实需要更复杂的框架的其他功能。

10-05 18:15