在哪里放置包含语句,标题或来源?

Moh*_*nde 100 c header include

我应该将包含在头文件或源文件中吗?如果头文件包含include语句,那么如果我在源代码中包含该头文件,那么我的源文件是否包含我头文件中包含的所有文件?或者我应该只将它们包含在我的源文件中?

sch*_*hot 128

如果标题本身需要它们,则只将标题包含在标题中.

例子:

  • 您的函数返回类型size_t.然后#include <stddef.h>文件中.
  • 你的功能使用strlen.然后#include <string.h>文件中.

  • 理由是什么? (7认同)
  • 如果我的函数接受`size_t`类型的参数怎么办? (2认同)

Jer*_*fin 27

多年来,对此有很多不同意见.有一段时间,传统上标题声明与它相关的任何模块中的内容,因此许多标题具有特定要求,即您#include具有某些标题集(按特定顺序).一些非常传统的C程序员仍然遵循这种模式(至少在某些情况下,宗教上).

最近,有一个让大多数标题独立的运动.如果该标题需要其他内容,则标题本身会处理该标题,确保包含所需内容(按正确顺序排列,如果存在排序问题).就个人而言,我更喜欢这个 - 特别是当标题的顺序很重要时,它只解决了一次问题,而不是要求每个使用它的人再次解决问题.

请注意,大多数标头应仅包含声明.这意味着添加不必要的标头不应该(通常)对最终的可执行文件产生任何影响.发生的最糟糕的事情是它减慢了编译速度.

  • 如果所有标头均采用第二种样式编写,则根本不会出现排序问题。标头中存在排序问题通常意味着您没有在标头中包括所需的所有内容。 (2认同)

Dav*_*ley 12

你的#includes应该是头文件,每个文件(源或头)应该#include是它需要的头文件.头文件应该#include是必需的最小头文件,源文件也应该,尽管它对源文件不重要.

源文件将具有标题#includes和标题#include,以此类推,直到最大嵌套深度.这就是为什么你不想#include在头文件中多余的原因:它们可能导致源文件包含许多它可能不需要的头文件,从而减慢了编译速度.

这意味着完全有可能头文件可能被包含两次,这可能是个问题.传统的方法是在头文件中加入"include guard",例如文件foo.h:

#ifndef INCLUDE_FOO_H
#define INCLUDE_FOO_H
/* everything in header goes here */
#endif
Run Code Online (Sandbox Code Playgroud)


小智 6

我发展到二十多年的方法就是这样。

考虑一个图书馆。

有多个C文件,一个内部H文件和一个外部H文件。C文件包括内部H文件。内部H文件包括外部H文件。

从编译器POV可以看到,它在编译C文件时有一个层次结构。

外部->内部-> C代码

这是正确的顺序,因为外部使用的是第三方使用该库所需的一切。编译C代码需要内部的代码。


Vic*_*cky 5

如果头文件 A#includes头文件 B 和 C ,那么 A 的每个源文件#includes也会得到 B 和 C #included。预处理器实际上只是执行文本替换:只要它找到文本,就会#include <foo.h>用文件文本替换它foo.h

关于是否应该放入#includes头文件或源文件存在不同的意见。就我个人而言,我更喜欢默认将所有内容放入#includes源文件中,但是如果没有其他先决条件标头就无法编译的任何标头文件都应该是#include这些标头本身。

每个头文件都应该包含一个包含保护,以防止它被多次包含。