#include in .h或.c / .cpp?

时间:2010-06-08 23:33:05

标签: c++ c

在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,或两者都是我在这里做过的?

4 个答案:

答案 0 :(得分:130)

尽可能多地放在.c .h.c.h中的包含仅在编译该文件时包含,但{{1}}的包含必须包含在使用它的每个文件中。

答案 1 :(得分:43)

您应该在另一个.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. NOT 尝试在.c文件中对您的包含进行排序以满足依赖关系(即,在标头A之前包括标头B);那是一堆胃灼热等待发生的事。我是认真的。我曾经多次参加过那部电影,但它总是以东京的火焰结束。

是的,这可能导致文件被多次包含,但如果它们具有适当的包含防护设置以防止多个声明/定义错误,那么额外的几秒构建时间就不值得担心。试图手动管理依赖项是一个痛苦的屁股。

当然,您不应该包含 所需的文件。

答案 2 :(得分:9)

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

还要考虑在hpp文件中使用forward declarations来进一步减少include依赖关系链。

答案 3 :(得分:5)

如果我#include <callback.h>,我不想要#include许多其他头文件来编译我的代码。在callback.h中,您应该包含编译所需的所有内容。但仅此而已。

考虑在头文件中使用前向声明(例如class GtkButton;)是否足够,允许您减少标题中#include指令的数量(反过来,我的编译时间和复杂性)。