gpt4 book ai didi

C 中的隐秘结构定义

转载 作者:太空狗 更新时间:2023-10-29 16:48:25 26 4
gpt4 key购买 nike

我遇到了以下 maze definition代码:

typedef struct mazeNode {
int hasCheese;
int tag;
struct mazeNode *left;
struct mazeNode *right;
} maze_t;

maze_t maze = {
.tag = 1,
.left = &(maze_t) {
.left = &(maze_t) {
.left = &(maze_t) {},
.right = &(maze_t) {}
},
.right = &(maze_t) {
.right = &(maze_t) {}
}
},
.right = &(maze_t) {
.tag = 8,
.left = &(maze_t) {},
.right = &(maze_t) {
.tag = 10,
.left = &(maze_t) {
.tag = 11,
.left = &(maze_t) {
.hasCheese = 1,
.tag = 12
}
},
.right = &(maze_t) {}
}
}
};

来自链接blog post我知道他们正在尝试用图中的奶酪定义二叉树。

但是,我似乎无法弄清 C 代码应该做什么。如果有人能向我解释一下就太好了。

最佳答案

此代码使用了 designated initializers 的组合和 compound literals , 它们都是 C99 features ,我链接到其他答案,我在其中提供了这两个功能的标准引号。

指定的初始值设定项允许您使用指定特定字段来使用 .fieldname = 进行初始化,链接文档中的示例是:

 struct point { int x, y; };

the following initialization

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

is equivalent to

struct point p = { xvalue, yvalue };

使用的另一个特性是复合文字,它被用来创建未命名的静态对象,然后代码获取该对象的地址并将其分配给相应的指针 leftright。然后它在未命名对象中递归地使用此功能来设置它们各自的 leftright 指针。

 .left = & (maze_t) { .... }
^^^^^^^^^^^^^^^^
unnamed static object

这些未命名的对象只有在函数体之外使用时才是静态的,否则它们将具有自动存储持续时间,并且一旦您退出函数就会不复存在,因此像代码那样获取它们的地址可能是不明智的.

作为引用,我在 answer here 中提供了关于复合文字的标准引用.

重要的是要注意,当使用指定的初始化器时,任何未显式初始化的字段都将是 initialized to zero ,这在这种情况下实际上很重要,例如 hasCheese 将被设置为 0 除非特别设置。

尽管这些是 C99 的特性,但并非所有编译器都支持或完全支持 C99,我在 Visual Studio 上的测试表明我们需要替换空的复合文字,例如:

left = &(maze_t) {}

使用 NULL 使其编译。我提交了 bug report .

对错误报告的响应如下,但基本上这是一个 gcc/clang 扩展在工作:

This is a GNU extension. Clang supports it as an extension (see the clang option -Wgnu-empty-initializer).

The standard way to write this is {0}, which will zero initialize all fields.

关于C 中的隐秘结构定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25578115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com