有时,在 C 中,您会这样做:
typedef struct foo {
unsigned int some_data;
} foo; /* btw, foo_t is discouraged */
要以 OO 的方式使用这种新类型,您可能有如下的分配/释放对:
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 完成的。
问题:1 元素数组“type-idiom”是否有任何不明显的缺陷?