简单地包含所有头文件是否正确?

时间:2011-11-12 00:41:25

标签: c

记住系统头文件的名称很痛苦......

有没有办法一次性包含所有现有的头文件?

为什么没有人这样做?

6 个答案:

答案 0 :(得分:9)

包含不需要的头文件是一种非常糟糕的做法。减慢编译速度的问题可能也可能不重要;更大的问题是它隐藏了依赖关系。您在源文件中包含的头文件集应该是模块所依赖的功能的文档,并且与外部文档或注释不同,编译器会自动检查它是否完整(未包含所需的头文件将导致错误)。确保不存在不必要的依赖性不仅可以提高可移植性;它还可以帮助您跟踪不需要的和潜在危险的交互,例如,应该是纯粹计算或纯数据结构管理的模块正在访问文件系统。

这些原则适用于标头是您自己的程序或第三方库中的模块的标准系统标头或标头。

答案 1 :(得分:5)

您的源代码文件在编译器查看之前已经过预处理,#include语句是预处理器使用的指令之一。在进行预处理时,#include语句将替换为所包含文件的全部内容。包含所有系统文件的结果将是编译器需要处理的非常大的源文件,这将在编译期间花费大量时间。

答案 2 :(得分:5)

没有人包含所有头文件。有太多,其中一些与其他文件互斥(如ncurses.h和curses.h)。

即使从头开始编写程序也没那么糟糕。一些很容易记住:任何FILE东西的stdio.h; ctype.h用于任何字符分类,alloc.h用于任何使用malloc()等。

如果你不记得一个:

  • 离开#include
  • 编译
  • 检查前几条错误消息,以指示缺少的头文件,例如某些未声明的类型,或调用假定参数类型的函数
  • 找出哪个函数调用是原因
  • 查看该函数的手册页(或编译器的任何文档)
  • 注意文档中显示的#include并添加
  • 重复,直到修复所有错误

添加到现有代码库要容易得多。您可以花费数百或数千个工作小时,而无需添加#include

答案 3 :(得分:1)

不,这是一个糟糕的想法,并且会大量增加您的编译时间,并且可能通过包含大量未使用的代码来使您的exe更大。

答案 4 :(得分:1)

我知道你在谈论什么,但我需要仔细检查我正在使用的功能的原型(对于那些我每天都不使用的功能) - 我只需复制并粘贴#includes直接从相关函数的联机帮助页中删除。我已经在查看联机帮助页(在K中这是一个简单的vim(1)),所以它不会是额外的负担。

答案 5 :(得分:1)

您可以创建一个“主”标题,您可以将所有包含放入其中。然后在其他一切包括它!谨防冲突的定义和循环引用......所以.... Master1.h,master2.h,...

不提倡它。只是说。