C标头包含防护,仅在头文件中使用,但不在.c文件中使用.为什么?

Adi*_* Ya 4 c header include-guards

我已经在头文件中使用了一段时间的保护,我理解为什么使用它们的唯一原因是在编译时启用单个包含此内容(包含保护的头文件).

我想知道是否有任何其他原因使用标题保护,为什么它们没有在.c文件中使用,如果保护用于.c文件会发生什么?

答.从以下回复中收集.

通常,所有定义都进入.c文件,头文件(.h文件)包含所有声明.包含.c文件不是一个好习惯.

为了在编译特定于翻译单元的过程中只与一个包含的.c文件可用的声明相关联(因此,如果有两个或更多的库需要链接;即,我们有两个或更多翻译单位); 标题保护有助于包含头文件ONLY ONCE.

这是因为预编译器阶段甚至在编译文件以获取对象(.o扩展名)文件之前.预处理器阶段替换整个宏并包含相关数据,这些数据只允许包含.h文件一次.

Som*_*ude 12

标题保护程序正在做的不是防止多个包含在项目中,而是仅在单个翻译单元中.

例如,假设您有两个头文件,a.h和b.h.头文件b.h包括a.h,然后都a.h和b.h被包括在源文件中s.c.如果没有标题保护,文件a.h将被包含两次,这可能会导致错误.如果头文件有标题保护,则该文件a.h只包含一次.

您不需要源文件中的标题保护,因为通常您不将它们包含在其他文件中.