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