在我看来,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来调整结构填充或对齐方式,则两个定义可能不再相同。这类问题很难调试,因为它取决于标头包含顺序。

通常,当您允许重新定义数据类型时,很多事情都会出错。作为交换,除了能够删除标头保护之外,您没有任何实际的好处。标头防护解决了这个问题,并且只是很小的开销,不会使代码不合理地混乱。一些编译器支持#pragma once(或类似的功能)充当include保护,但只需要一行代码。

以我个人的观点,最好防止默认情况下的多次包含,并且仅在设计为多次包含的标头上要求使用保护宏(将开销留给少数情况下的用例)。但是,这并不是C最初实现的方式(另外,它会使预处理器更加复杂),因此它永远不可能改变。

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

10-11 22:52
查看更多