我对打算在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所述),但是我建议您确保确实需要更复杂的框架的其他功能。