我昨天发现了一些 struct 初始化代码,这让我很困惑.下面是一个例子:

typedef struct { int first; int second; } TEST_STRUCT;
void testFunc() {
    TEST_STRUCT test = {
        second: 2,
        first:  1
    };
    printf("test.first=%d test.second=%d\n", test.first, test.second);
}

令人惊讶的是(对我来说),以下是结果:

-> testFunc
test.first=1 test.second=2

如您所见,该 struct 已正确初始化.我不知道带标签的语句可以这样用.我见过几种其他的 struct 初始化方法,但在任何在线C常见问题解答中都没有找到任何这种 struct 初始化的示例.有没有人知道这是怎么回事/为什么这么做?

推荐答案

以下是gcc手册的一节,它解释了 struct 和数组的指定初始值设定项的语法:

在 struct 初始值设定项中,指定要初始化的字段的名称

 struct point { int x, y; };

下面的初始化

 struct point p = { .y = yvalue, .x = xvalue }; 

相当于

 struct point p = { xvalue, yvalue }; 

另一个具有相同含义的语法是‘fieldname:’,从GCC 2.5后就过时了,如下所示:

 struct point p = { y: yvalue, x: xvalue };

相关页面可以找到here.

你的编译器应该有类似的文档.

C++相关问答推荐

有关字符数组指针和次指针以及qsort函数中的cmp函数的问题

C中的整字母后缀i是什么

问关于C中的指针和数组

如何使用低级C++写出数值

在c++中使用堆栈的有效括号

C由四个8位整数组成无符号32位整数

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

使用scanf在C中读取和存储文件中的值

如何捕捉只有换行符或空格字符缓冲区的边缘大小写

Vcpkg的配置文件

<;unistd.h>;和<;sys/unistd.h>;之间有什么区别?

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

条件跳转或移动取决于未初始化值(S)/未初始化值由堆分配创建(Realloc)

生产者消费者计数器意外输出的C代码

具有正确标头的C struct 定义问题

Fscanf打印除退出C代码为1的程序外的所有内容

当用C打印过多的';\n';时输出不正确

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

程序对大输入给出错误答案

在C中定义函数指针?