gpt4 book ai didi

c - 为什么不允许多次定义 C 结构体的成员?

转载 作者:行者123 更新时间:2023-11-30 15:57:43 25 4
gpt4 key购买 nike

在我看来,C 中禁止多次声明结构体成员的规则是需要包含防护的主要原因。如果我们在“header.h”中有以下内容:

struct s {
int a;
char b;
};

并且文件“a.h”#include 的 header.h,那么我们不能同时包含“a.h”和“header.h”,因为这样 struct s 被定义了两次。

我的问题是,这样做有什么问题吗?为什么不允许有多个相同的结构定义?这将消除对包含防护的需要,并极大地清理 C 头文件。

C 中的规则是允许多个声明,但只能有一个定义。由于某种原因,指定结构体的成员被称为“定义”,即使它没有定义变量或函数。

最佳答案

重新定义结构非常容易出错。即使在简单的示例中,如果 a.h 包含一个在包含“header.h”之前调整结构打包或对齐的 #pragma,那么这两个定义可能不一定相同。此类问题很难调试,因为它依赖于 header 包含顺序。

一般来说,当您允许重新定义数据类型时,可能会出现很多问题。作为交换,除了能够放下头护罩之外,您不会从中获得任何真正的好处。 header 防护解决了这个问题,并且只是很小的开销,不会使代码变得不合理。一些编译器支持#pragma Once(或类似的),它充当包含保护,但只需要一行代码。

在我个人看来,默认情况下防止多次包含是一个更好的主意,并且仅在设计要包含多次的 header 上要求保护宏(将开销留给使用这种情况属于极少数)。不过,这并不是 C 最初实现的方式(而且它会使预处理器更加复杂),因此它不太可能改变。

关于c - 为什么不允许多次定义 C 结构体的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10320563/

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