[英]Odd use of curly braces in C
抱歉问了一个简单的问题,但我正在度假,正在阅读一本关于核心音频的书,而且我没有带 C 或 Objective C 的书......
这个变量定义中的花括号有什么作用?
MyRecorder recorder = {0};
假设MyRecorder
是一个struct
,这MyRecorder
每个成员设置为它们各自的零表示( 0
表示整数, NULL
表示指针等)。
实际上,这也适用于所有其他数据类型,例如int
、 double
、指针、数组、嵌套结构……,您可以想象的一切(感谢 pmg 指出这一点!)
更新:从上面链接的网站中摘录的引用,引用了 C99 的最终草案:
[6.7.8.21] 如果花括号括起来的列表中的初始值设定项少于聚合的元素或成员,[...] 聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。
它根据 C99 标准将recorder
结构的所有成员初始化为0
。 看起来它用0
位初始化结构的每一位。 但并非每个编译器都如此。
请参阅此示例代码,
#include<stdio.h>
struct s {
int i;
unsigned long l;
double d;
};
int main(){
struct s es = {0};
printf("%d\n", es.i);
printf("%lu\n", es.l);
printf("%f\n", es.d);
return 0;
}
这是输出。
$ ./a.out
0
0
0.000000
它是一个结构的初始化。
实际上,它不会初始化结构的所有元素,只是初始化第一个元素。 但是,其他的会自动初始化为 0,因为这是 C 标准要求做的。
如果你把:MyRecorder recorder = {3};
第一个元素将为 3,其他元素将为 0。
与 C++11 不同,在 C99 中,初始化括号中必须至少有一个元素。
C++11 结构:
MyRecorder recorder{};
C结构:
MyRecorder recorder = {0};
MyRecorder
可能是以下之一,您正在尝试用零初始化所有元素
typedef struct _MyRecorder1 {
int i;
int j;
int k;
}MyRecorder1;
typedef int MyRecorder2[3];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.