可以将标头文件包含在多个源文件中,而无需重复保护

Can a header file be included in multiple source files, without duplicate protection

本文关键字:保护 源文件 文件包      更新时间:2023-10-16

大多数标头文件都包裹其内容:

#ifndef MY_HEADER_H
#define MY_HEADER_H
// header body...
#endif MY_HEADER_H

如果删除了,当将标头文件加入多个源文件中时会导致问题吗?还是预处理器足够聪明以忽略它?(我知道当它多次包含在同一源文件中时会导致问题)

如果将其删除,将在多个源文件中加入标头文件时会引起问题?

否。当将标头文件多次包含在同一源文件中时,可能会导致问题。

或预处理器足够聪明以忽略它?

否。预处理器一次不知道多个源文件。

如果删除了这一点,是否会在包含标头文件时引起问题...

可能,是的。不必要。通常,这取决于。特别是,这取决于标头的内容以及是否将标头包含在单个翻译单元(tu)中。可以重复一些声明 - 其他声明可能不会。例如,不得重复定义。

...在多个源文件中?

标头是否具有后卫宏与包含在多个tus中的标题无关。每个TU分别预处理,并且警卫不会阻止将其纳入多个TU。

标头包含可能未包含在一个以上的TU中的定义(例如非内部功能的定义),则标题通常不是很有用(尽管存在一个实际示例:某些标头 - 只有库提供了一种包含自己的main功能定义的方法)。

预处理器如何知道忽略它是正确的事情?例如,考虑以下标头文件" foobar.h":

FOO(BAR);

和以下C代码:

 int main()
 {
#define FOO printf
#define BAR "hello"
#include "foobar.h"
#undef BAR
#define BAR " worldn"
#include "foobar.h"
 }

在这里,忽略第二次尝试包含文件的尝试将破坏程序的行为。

因此,由于编译器不知道忽略它是正确的事情,所以它不能忽略它。因此,如果您要它忽略它,就必须告诉它。