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

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

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

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 中,还是像我在这里所做的那样两者都包含?

103745 次浏览

.c中放入尽可能多的内容,在 .h中放入尽可能少的内容。.c中的包含只有在编译该文件时才包含,但是使用 .h的每个文件都必须包含 .h的包含。

如果我的 #include <callback.h>,我不希望有 #include很多其他头文件得到我的代码来编译。在 callback.h中,应该包含针对它进行编译所需的所有内容。但仅此而已。

考虑在头文件(比如 class GtkButton;)中使用转发声明是否足够,这样可以减少头文件中 #include指令的数量(进而减少编译时间和复杂性)。

在 cpp 中放置尽可能多的 include,并且只放置 hpp 文件所需要的 include。我相信这将有助于加快编译,因为 hpp 文件将交叉引用较少。

还可以考虑在 hpp 文件中使用 远期声明来进一步减少包含依赖链。

只有在这种情况下,才应该在另一个标题中包含标题。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) ; 这是一大堆等待发生的心痛。我是认真的。我去过那部电影好几次,结局都是东京陷入火海。

是的,这可能导致文件被多次包含,但是如果它们设置了适当的包含保护以防止多个声明/定义错误,那么额外几秒钟的构建时间就不值得担心了。尝试手动管理依赖关系是一件令人头疼的事情。

当然,您不应该包含那些不包含 需要的文件。

我建议在项目中简单地包含 All.h,其中包括所有需要的头文件和其他所有头文件。H 文件调用 All.h 和每个。转交。Cpp 文件只包含它自己的头。