【发布时间】:2013-09-01 16:52:52
【问题描述】:
有时,在 C 中,你会这样做:
typedef struct foo {
unsigned int some_data;
} foo; /* btw, foo_t is discouraged */
要以一种面向对象的方式使用这种新类型,您可能有如下这样的分配/释放对:
foo *foo_alloc(/* various "constructor" params */);
void foo_free(foo *bar);
或者,或者,初始化/清除对(可能返回错误代码):
int foo_init(foo *bar, /* and various "constructor" params */);
int foo_clear(foo *bar);
我见过使用以下成语,特别是在 MPFR 库中:
struct foo {
unsigned int some_data;
};
typedef struct foo foo[1]; /* <- notice, 1-element array */
typedef struct foo *foo_ptr; /* let's create a ptr-type */
alloc/free 和 init/clear 对现在改为:
foo_ptr foo_alloc(/* various "constructor" params */);
void foo_free(foo_ptr bar);
int foo_init(foo_ptr bar, /* and various "constructor" params */);
int foo_clear(foo_ptr bar);
现在您可以像这样使用它(例如,init/clear 对):
int main()
{
foo bar; /* constructed but NOT initialized yet */
foo_init(bar); /* initialize bar object, alloc stuff on heap, etc. */
/* use bar */
foo_clear(bar); /* clear bar object, free stuff on heap, etc. */
}
备注:init/clear 对似乎允许更通用的方式来初始化和清除对象。与 alloc/free 对相比,init/clear 对要求已经构造了一个“浅”对象。 “深度”构造是使用 init 完成的。
问题:单元素数组“type-idiom”有什么不明显的缺陷吗?
【问题讨论】: