C 为什么不在头文件中声明结构?不会';这难道不意味着不需要防护装置吗?

C 为什么不在头文件中声明结构?不会';这难道不意味着不需要防护装置吗?,c,struct,include,include-guards,C,Struct,Include,Include Guards,我最近意识到,虽然在给定的翻译单元中多次定义某个东西是非法的,但只要你愿意,多次声明某个东西(函数、变量、结构)是完全合法的。我的印象是,加入警卫的目的是防止重复申报 事实上,它们的目的似乎是防止重复的定义。但是,由于函数和变量定义正确地属于.c文件,而不是.h文件,只有.h文件被包含,这似乎意味着只有结构和联合存在问题(因为我们通常在.h文件中定义它们,而不仅仅是声明它们)。(即使是上的示例也使用结构定义) 我的问题是:为什么在头文件中定义结构如此常见?难道我们不能只在头文件中声明它们,然后将

我最近意识到,虽然在给定的翻译单元中多次定义某个东西是非法的,但只要你愿意,多次声明某个东西(函数、变量、结构)是完全合法的。我的印象是,加入警卫的目的是防止重复申报

事实上,它们的目的似乎是防止重复的定义。但是,由于函数和变量定义正确地属于.c文件,而不是.h文件,只有.h文件被包含,这似乎意味着只有结构和联合存在问题(因为我们通常在.h文件中定义它们,而不仅仅是声明它们)。(即使是上的示例也使用结构定义)


我的问题是:为什么在头文件中定义结构如此常见?难道我们不能只在头文件中声明它们,然后将它们的定义放在.c文件中,然后包含卫士,这是完全不必要的,因为重复声明是可以的


如果我不得不猜测的话,那是因为如果我们这样做了,那么包含这些头文件的源文件唯一能做的就是创建指向结构的指针,因为它们包含的字段的定义在其他一些.c文件中。准确吗?

为了有意义地使用结构类型,即为了能够访问其内容,为了定义该结构类型的对象,为了知道该结构类型的大小,您必须定义该结构类型。定义必须在要使用上述结构类型的每个翻译单元中可见。这就是您希望在头文件中定义结构类型的原因

如果只在头文件中声明结构类型,则无法执行任何操作。对于已声明(但未定义)的结构类型,唯一可以做的就是声明指向该结构类型的指针。这是一个有价值的辅助功能,但它本身是完全无用的

另外需要注意的是,include防护不仅仅是为了防止结构类型的多个定义。C语言还禁止重复的
typedef
声明(C++特别允许),重复的静态函数定义,重复的静态变量定义,重复的宏定义,重复的枚举定义,以及其他可能的东西


但是您是对的,如果您的头文件只包含可以在同一翻译单元中合法重复的声明,那么正式地说,您不需要在该头文件中包含保护。

为了有意义地使用结构类型,即为了能够访问其内容,定义该结构类型的对象,要知道该结构类型的大小,必须定义该结构类型。定义必须在要使用上述结构类型的每个翻译单元中可见。这就是您希望在头文件中定义结构类型的原因

如果只在头文件中声明结构类型,则无法执行任何操作。对于已声明(但未定义)的结构类型,唯一可以做的就是声明指向该结构类型的指针。这是一个有价值的辅助功能,但它本身是完全无用的

另外需要注意的是,include防护不仅仅是为了防止结构类型的多个定义。C语言还禁止重复的
typedef
声明(C++特别允许),重复的静态函数定义,重复的静态变量定义,重复的宏定义,重复的枚举定义,以及其他可能的东西


但是您是对的,如果您的头文件只包含可以在同一翻译单元中合法重复的声明,那么正式地说,您不需要在该头文件中包含保护。

OP:我的问题是:为什么在头文件中定义结构如此常见

多个.c文件使用的结构需要共享相同的定义,因此在.h文件中也是如此

单个.c文件的本地结构(使它们实际上是“静态”的或本地范围的)应该在.c文件中声明,而不是在成对的.h文件中声明


在这种情况下,维护需要包括防护装置。正如OP所说,结构定义可以在.c文件中,并以这种方式共享(相同),但这会带来维护噩梦。声明/定义共享结构+一次,然后可以在一个地方维护它们。

OP:我的问题是:为什么在头文件中定义结构如此常见

多个.c文件使用的结构需要共享相同的定义,因此在.h文件中也是如此

单个.c文件的本地结构(使它们实际上是“静态”的或本地范围的)应该在.c文件中声明,而不是在成对的.h文件中声明


在这种情况下,维护需要包括防护装置。正如OP所说,结构定义可以在.c文件中,并以这种方式共享(相同),但这会带来维护噩梦。声明/定义共享结构+ OnCeI,然后可以将它们保持在一个地方。

在C++中,必须在头文件中包含类定义,以便使用模板。也许有一个类似的C。是的,实际上,我正在尝试学习C++中的模板,我发现模板的实现必须进入头文件,这让我感到震惊(虽然我明白为什么)。这让我想到“等等,我认为不把函数定义放在头文件中有一个很好的理由”,所以我想在继续学习模板之前,确保我在C语言中牢牢掌握了这一点。C++忽略了它们……“我们不能只在头文件中声明它们,然后将它们的定义放在.c文件中”——不。试试看,看看会发生什么。另外,阅读有关DRY的文章(不要重复你自己)。。。重复结构