有时候,在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);
或者,另外一种方式是使用init/clear对(可能会返回错误代码):
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元素数组“类型惯用语”的任何非明显缺陷吗?