繁体   English   中英

C中花括号的奇怪用法

[英]Odd use of curly braces in C

抱歉问了一个简单的问题,但我正在度假,正在阅读一本关于核心音频的书,而且我没有带 C 或 Objective C 的书......

这个变量定义中的花括号有什么作用?

MyRecorder recorder = {0};

假设MyRecorder是一个struct ,这MyRecorder每个成员设置为它们各自的零表示0表示整数, NULL表示指针等)。

实际上,这也适用于所有其他数据类型,例如intdouble 、指针、数组、嵌套结构……,您可以想象的一切(感谢 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM