#include在.h或.c / .cpp中?


118

使用C或C ++进行编码时,我应该在哪里#include

callback.h:

#ifndef _CALLBACK_H_
#define _CALLBACK_H_

#include <sndfile.h>
#include "main.h"

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data);
void on_button_cancel_clicked(GtkButton* button, struct user_data_s* data);

#endif

callback.c:

#include <stdlib.h>
#include <math.h>

#include "config.h"

#include "callback.h"
#include "play.h"

void on_button_apply_clicked(GtkButton* button, struct user_data_s* data) {
  gint page;
  page = gtk_notebook_get_current_page(GTK_NOTEBOOK(data->notebook));

  ...

应该全部包含在.h或.c / .cpp中,还是像我在此处所做的那样都包含在其中?


2
让我来扭转这个局面,问:什么是的决定把sndfile.h和main.h在callback.h标准是什么?
Owen S.

Answers:


161

尽可能多地放入中.c,尽可能少地放入中.h。在该包括.c当一个文件被编译只包括在内,但包括了.h必须通过每一个文件使用它包括在内。


6
是的,但是#ifndef _CALLBACK_H_,它上方的,是否不能阻止编译器多次处理它?
2014年

11
@ user9379这样可以防止每个.c或.cpp文件多次包含该文件。但是,每个.c或.cpp文件通常都是单独构建的,这意味着将为您编译的每个.c或.cpp文件重新解析.h。
布伦丹·朗

2
我认为,尽可能少地放入的主要原因.h是为了避免在某些情况下由于包含循环而导致的错误。示例:两个类的实现彼此需要,但不需要它们的声明。将两个include都放入.cpps可以避免错误。
Codoscope

1
@ Qu'est-cet'yont这就是为什么您不能在.h文件中放入某些内容的原因。这个答案是关于为什么你应该放更少的东西。
布伦丹·朗

@BrendanLong我知道了,尽管就我而言,多次包含相同的标头并不重要,如果您将正确的宏放入其中仅包含一次内容。因此,我认为放更少的钱是为了减少将来通过修改代码而出错的可能性。
Codoscope

55

唯一应在另一个.h文件中包含标头的情况是,是否需要访问该标头中的类型定义;例如:

#ifndef MY_HEADER_H
#define MY_HEADER_H

#include <stdio.h>

void doStuffWith(FILE *f); // need the definition of FILE from stdio.h

#endif

如果标题A取决于标题B,例如上面的示例,则标题A应直接包含标题B。难道尝试来订购包括.c文件来满足相关性(即,包括头A之前头B); 那是一大堆等待发生的胃灼热。我是认真的。我去过那部电影好几次了,但总是以东京为结尾。

是的,这可能会导致文件被多次包含,但是如果它们设置了适当的包含保护以防止出现多个声明/定义错误,那么值得花几秒钟的构建时间。尝试手动管理依赖项是一件麻烦事。

当然,您不应该在不需要的地方包含文件。


10

将尽可能多的包含在您的cpp中,并且仅将hpp中的hpp文件所需的包含在内。我相信这将有助于加快编译速度,因为hpp文件的交叉引用会更少。

还可以考虑在hpp文件中使用前向声明,以进一步减少包含依赖关系链。


1
哦 前向声明很有趣。
布伦丹·朗

在循环引用方案中,Parappa的前向声明非常有用。但是在其他情况下,它们是否是一种好的做法?(我是C ++的新手,所以我
实话实

5

如果是I #include <callback.h>,我不需要#include大量其他头文件来编译我的代码。在其中callback.h应包括进行编译所需的所有内容。但仅此而已。

考虑在头文件中使用前向声明(例如class GtkButton;)是否足够,从而可以减少#include头中的指令数量(进而减少编译时间和复杂度)。


我不同意。在H文件中包含整个世界会增加依赖链,从而增加编译时间。
John Dibling 2010年

我的回答并没有建议包括在头文件中的整个世界,我建议包括刚刚足以使API的用户不必花费时间搜索的依赖。
Johnsyweb 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.