我刚刚在阅读一个名为sofia-sip的库,这段代码出现在代码示例中:
msg_iovec_t iovec[2] = {{ 0 }};
供参考,以下是 msg_iovec_t 的定义:
struct iovec {
void *iov_base; // Pointer to data.
size_t iov_len; // Length of data.
};
我刚刚在阅读一个名为sofia-sip的库,这段代码出现在代码示例中:
msg_iovec_t iovec[2] = {{ 0 }};
供参考,以下是 msg_iovec_t 的定义:
struct iovec {
void *iov_base; // Pointer to data.
size_t iov_len; // Length of data.
};
这将在堆栈上创建了一个包含两个iovec
结构的数组,并将两个数组元素的所有成员初始化为零。
初始化程序{{ 0 }}
仅为第一个数组元素的第一个成员iovec[0].iov_base
提供了一个明确的值:提供的值0会隐式转换为null指针。
第一个数组元素的其他成员和其他数组元素也被隐式初始化:指向null的指针和算术类型为0。
该行可以等价地写为
msg_iovec_t iovec[2] = { 0 };
这是零初始化整个对象的最短标准方式,因此它是惯用语。一些编译器可能会接受空初始化列表{}
作为扩展。一些编译器可能会对此形式发出警告,并要求足够的大括号来指定第一个非聚合成员(例如原始行中的两对)。
其效果类似于
msg_iovec_t iovec[2];
bzero(iovec, sizeof iovec);
除了更加干净和便携之外,因为空指针并不一定填充了零字节,所以要小心。
bzero(&myptr, sizeof(myptr));
不等同于 myptr = 0;
(myptr = NULL;
)。 - Conrad Meyer{}
不是 有效的 C 语言,它只适用于 C++。{0}
是 C 语言中最短的通用零初始化器。 - R.. GitHub STOP HELPING ICEgcc
可以在没有-pedantic
的情况下接受它)。@Conrad - 这就是我所说的“类似”的意思 - 已经澄清了。 - aaz{ 0 }
的支持,通过发出警告来初始化多级聚合体(比如结构体数组)。通常人们会使用{ 0 }
,但由于有警告,所以必须使用{{ 0 }}
。 - AnT stands with Russia第一个括号声明正在初始化数组。第二个声明结构体的iovec
第一个字段:iov_base
正在被初始化为NULL值。