c语言中void的初始值设定项,在C99 +中组合指定的初始值设定项和malloc?

既然你问了;)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的调用失败时导致指针无效。另一方面,这重新向初始化者发出一个命令,所以也不完美。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值