头文件可以包含在多个源文件中,而没有重复保护

时间:2019-02-19 01:55:34

标签: c++ c

大多数头文件将其内容包装为这样:

#ifndef MY_HEADER_H
#define MY_HEADER_H

// header body...

#endif MY_HEADER_H

如果将其删除,则将头文件包含在多个源文件中时是否会引起问题?还是预处理器足够聪明,可以忽略它? (我知道在同一源文件中多次包含它会导致问题)

3 个答案:

答案 0 :(得分:3)

  

如果将其删除,将头文件包含在多个源文件中时会引起问题吗?

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

  

还是预处理器足够聪明,可以忽略它?

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

答案 1 :(得分:2)

  

如果将其删除,则在包含头文件时会导致问题...

可能是。不必要。通常,这取决于。特别是,它取决于标头的内容以及标头是否多次包含在单个转换单元(TU)中。有些声明可以重复,有些则可以不重复。例如,不得重复定义。

  

...在多个源文件中?

标头是否具有保护宏与标头包含在多个TU中无关。每个TU都经过单独的预处理,并且保护措施并不能防止将其包含在多个TU中。

如果标头包含可能不包含在一个以上TU中的定义(例如,非内联函数的定义),则该标头通常不是很有用(尽管存在一个实际示例):某些标头仅库提供了一种包含其自己的main函数定义的方法。

答案 2 :(得分:-1)

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

FOO(BAR);

以及以下C代码:

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

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

因此,由于编译器无法知道忽略它是正确的事情,因此它无法忽略它。因此,如果您希望它忽略它,则必须告诉它。