既然你问了;)C中有一个工具可以避免显式重复的代码宏。这就是说我没有看到一种不重复至少这种类型的名称的方法。但在C++他们不能要么,所以C是至少一样好:)
我看到的最简单的就是
#define DESIGNATE_NEW(T) \
memcpy(malloc(sizeof(T)), \
&(T const){ __VA_ARGS__ }, \
sizeof(T))
这将使
Type *t = DESIGNATE_NEW(Type,
.a = 2,
.b = 3,
.c = 5,
);
这有几个优点。
它正确初始化所有成员,甚至在与0的浮法类型或指针非 标准表示架构。
除了Keith的版本,它是“编码风格”是可以接受的,因为它只是一个看起来像初始化的表达式,任何人都应该直观地捕获第二个代码片断应该做的事情。
注意:观察宏中的const,如果编译器确定这是相关的,则允许折叠复合文本的多个实例。另外,还有一种方法可以使用指示符列表可选的变体,请参阅下面的P99。
缺点是memcpy和我会更快乐与任务。其次,在使用结果之前,没有检查malloc的失败,但可能会遇到一些奇怪的情况,以使代码良好地退出。
在P99我采取了稍微不同的方式。在那里,我们总是有一类的初始化函数,像
inline
Type* Type_init(Type* t, int a, int b, int c) {
if (t) {
*t = (Type const){ .a = a, .b = b, .c = c };
}
return t;
}
其受宏观神奇,可向为a,b和c提供默认参数,如果省略它们。然后你可以简单地使用类似于
Type *t = P99_NEW(Type, 1, 2, 3);
在你的应用程序代码。这比较好,因为它避免了在malloc的调用失败时导致指针无效。另一方面,这重新向初始化者发出一个命令,所以也不完美。