gpt4 book ai didi

c - 为什么匿名结构(非 typedef'd)在 c 语言中有用?

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

我意识到每当我打字

typedef struct {
// ...
} foo;

有一个正在被类型定义的匿名结构。我想不出有什么方法可以将匿名结构传递给函数,所以它看起来毫无用处。
我能想到的唯一用途是像这样的 C++ 中的东西:

struct {
char* name;
int age;
} alice;

void print_info(auto v) {
printf("name: %s age: %i", v.name, v.age);
}

int main() {
alice.name = "Alice";
alice.age = 24;
print_info(alice);
}

尽管 c 缺少任何类似的内置多态性,但它也允许匿名结构。

任何人都可以找到有用的情况吗?

最佳答案

这种未定义类型的匿名结构的用途非常有限,但并非完全为零。基本上,它们允许您将一些数据分组到一个函数或单个源文件中。

这样做的一个结果是,在文件范围内定义的任何此类变量都应该是 static,因为在其他文件中没有可用的适当声明。在单个函数内,变量可以是自动的,也可以是static,视需要而定;我想如果你有 struct { … } *peculiar; 那么你甚至可以管理动态分配。然而,如果您喜欢玩火和双重维护噩梦,您实际上可以在其他源文件中引用原始变量——您不应该这样做!因此,有可能(但请不要这样做!):

  • file1.c

    struct { char* name; int age; } alice;
  • file2.c

    extern struct { char* name; int age; } alice;

但是,如果您需要在源文件之间共享信息,请创建一个 header 并为结构类型命名(通过标签或 typedef 或两者)。

(为什么这行得通?想想编译器在预处理后看到了什么?它在每个 TU 中看到等效信息,如果定义/声明匹配,它就会正确。但是当你有时确保它们匹配要容易得多提供它们的单个 header 。)

假设您没有沉迷于这种可疑的做法,那么您是正确的,没有办法传递这些变量。因此,您可能会使用具有文件范围但内部链接的结构化变量,源文件中的多个函数可以访问它。这样的设计远非闻所未闻,尽管它们常常有点可疑。

请注意,如果您有:

static struct {
char* name;
int age;
} alice;

static struct {
char* name;
int age;
} bob;

然后 alicebob 有不同的类型(所以你不能写成 bob = alice;alice = bob; )。

因此,总的来说,此类变量的使用有限,但并非零使用。使用这些变量很少是个好主意,但如果有充分的理由(经得起仔细的批判性审查,最好由几个人审查),那么您可以继续使用它们。但是你需要真正确定结构标签的成本是 Not Acceptable 。 (如果只是为了更好地记录它所代表的内容,我至少会添加结构标签。)

关于c - 为什么匿名结构(非 typedef'd)在 c 语言中有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48132801/

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