#include <>不同文件中的文件

Vij*_*jay 3 c compiler-construction

如果我有几个头文件:让说1.h,2.h,3.h.假设所有三个头文件都#include <stdlib.h>包含其中一个包含文件.当我必须在C文件中使用所有3个头文件时main.c,它将#include <stdlib.h>在预处理器之后有3个副本.编译器如何处理这种冲突?这是一个错误还是会产生任何开销?

如果没有头部防护,会发生什么?

mrk*_*rkj 7

大多数C头包含如下:

#ifndef FOO_H
#define FOO_H

/* Header contents here */

#endif
Run Code Online (Sandbox Code Playgroud)

第一次预处理器扫描它时,它将包含标头的内容,因为FOO_H未定义; 但是,它还定义了FOO_H防止第二次添加标题内容.

多次包含标头会对性能产生很小的影响:预处理器每次都必须转到磁盘并读取标头.这可以通过在C文件中添加保护来减轻,包括:

#ifndef FOO_H
#include <foo.h>
#endif
Run Code Online (Sandbox Code Playgroud)

这篇文章在大型C++软件设计(一本优秀的书)中有详细讨论.


sch*_*der 5

这通常通过预处理器语句解决:

#ifndef __STDLIB_H
  #include <stdlib.h>
  #define __STDLIB_H
#endif
Run Code Online (Sandbox Code Playgroud)

虽然我从来没有看到过常见的头文件stdlib.h,所以它可能只是你自己的头文件所必需的.

  • 包含警卫总是在.h文件中.如果他们不在那里你会得到很多重复的定义错误 (3认同)

Dre*_*ann 5

预处理器包括所有三个副本,但是标头保护将阻止除第一个副本之外的所有副本.

标题保护将告诉预处理器将该头文件的后续副本转换为实际上没有任何内容.

回复编辑:

标准库标题将具有标题保护.他们没有守卫是非常不寻常和不正确的.

同样,您有责任在自己的标题上使用标题保护.

如果缺少标题保护,假设您会收到与重复定义相关的各种错误.