我刚刚读到一个名为sofia-sip的图书馆,这一行出现在code sample中:
msg_iovec_t iovec[2] = {{ 0 }};
供参考,以下是msg_iovec_t的定义:
struct iovec {
void *iov_base; // Pointer to data.
size_t iov_len; // Length of data.
};
答案 0 :(得分:8)
这会在堆栈上创建一个包含两个iovec
结构的数组,并将两个数组元素的所有成员初始化为零。
初始值设定项{{ 0 }}
仅为第一个数组元素的第一个成员提供显式值:iovec[0].iov_base
。提供的值0被隐式转换为空指针。
第一个数组元素的其他成员和其他数组元素也被隐式初始化:指向null的指针和0的算术类型。
该行可以等效地写为
msg_iovec_t iovec[2] = { 0 };
这是对整个对象进行零初始化的最短标准方法,因此它是惯用的。某些编译器可能会接受空的初始化列表{}
作为扩展名。某些编译器可能会对此表单发出警告,并且需要足够的大括号来指定第一个非聚合成员(原始行中的两对)。
效果类似于
msg_iovec_t iovec[2];
bzero(iovec, sizeof iovec);
除了清洁和可移植之外,因为填充零字节的指针不一定是空指针。
答案 1 :(得分:2)
第一个括号声明正在初始化数组。第二个声明结构的iovec
第一个字段:iov_base
正由NULL值初始化