gpt4 book ai didi

c - 为什么允许命名嵌套结构?

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:09 25 4
gpt4 key购买 nike

我偶然发现了 C 的一个非常奇怪的特性:您可以在另一个结构中声明一个命名结构,前提是同时声明该类型的成员变量:

struct Robot_st {
int pos_x;
int pos_y;
struct BatteryStatus_st { /* <- named struct */
int capacity;
int load;
} battery;
};

然后内部结构像任何其他类型一样在结构外部变得可用,呈现像这样的奇怪代码完全有效:

struct Robot_st my_robot = {2, 3, {200, 50}};
struct BatteryStatus_st battery_snapshot; /* <- use of inner struct */

memcpy(
&battery_snapshot,
&my_robot.battery,
sizeof(struct BatteryStatus_st)
);

printf("robot position: %d,%d\n", my_robot.pos_x, my_robot.pos_y);
printf("battery load: %d%%\n", battery_snapshot.load);

嵌套未命名结构感觉不错,因为您以后无法访问该类型,因此不会混淆该类型的范围。上面的代码在 C++ 中也是无效的,尽管嵌套声明是有效的,因为 C++ 将其理解为外部结构命名空间中的类型,因此您需要使用

struct Robot_st::BatteryStatus_st battery_snapshot;

尽管同时声明类型和成员感觉很奇怪,但更有意义。

那么为什么这个构造在 C 中有效?背后有什么历史/原因吗?这种结构有用例吗? (我是一个导致失败的错误,因此是这个问题。)

Link to full working code .

最佳答案

这样的构造最初在 C 中是允许的,因为结构名称占据了一个完全属于它们自己的宇宙,它从来没有应用任何类型的范围规则 [struct member names 顺便说一句,它也是为什么旧标准库中的某些结构类型在其成员上有前缀]。由于某些代码以与作用域不一致的方式使用结构名称,因此无法在不破坏现有代码的情况下更改标准以禁止此类使用。虽然有时值得破坏现有代码(例如,让 C 摆脱名为 gets 的可憎行为),但这确实不是其中之一。

关于c - 为什么允许命名嵌套结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373690/

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