#include 在 .h 或 .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 中,或者像我在这里所做的那样?

原文由 Louise 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 632
2 个回答

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

原文由 Brendan Long 发布,翻译遵循 CC BY-SA 2.5 许可协议

唯一应该在另一个 .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);那是一大堆胃灼热等待发生。我是认真的。我看过那部电影好几次,它总是以东京着火结束。

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

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

原文由 John Bode 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题