在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,或两者都是我在这里做过的?
答案 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
指令的数量(反过来,我的编译时间和复杂性)。