如何在文件中正确拆分C程序然后包含?

时间:2013-08-22 22:38:55

标签: c include c-preprocessor code-organization

我组织了我的程序,将每个实体拆分为自己的文件。 这就是这样的。

main.c

#include "student.h"
#include "subject.h"
#include "classroom.h"

#define PI 3.14
int sum(int a, int b);

student.h

typedef struct st student;

student.c

#include "student.h"

subject.h

typedef struct sb subject;

subject.c

#include "subject.h"

classroom.h

typedef struct cr classroom;

classroom.c

#include "classroom.h"

我的问题是,在教室内,我需要学生主题。 我应该怎么包括这个?我应该在 classroom.h classroom.c

中包含这些内容
#include "student.h"
#include "subject.h"

其次,我在 main.c 上有所使用的东西,如 sum() PI

如何以正确的方式包括在头文件中实现或在实现文件中包含头文件?我应该包括标题或实现文件吗?

如果我将所有内容都放在一个文件上,它编译得很好,但是我没有这样做,它不能编译。

4 个答案:

答案 0 :(得分:4)

首先。有关 .h (标题)文件的重要信息。他们应该有以下几点。

// In the top of the file
#ifndef NAME_OF_FILE_H
#define NAME_OF_FILE_H

// Your header code goes here

// In the end of the file
#endif

为什么要这样?如果您要在多个其他文件中包含您的标题文件,例如 header.h file1.c file2.c ,您基本上会重复代码,这意味着 header.h 中的代码将是在编译过程中放在两个文件中。

使用这些预处理器说明可以确保 header.h 中的代码只在程序中存在一次。

现在。你把#includes放在哪里?好吧,我假设 student.h subject.h 文件将声明在 student.c subject.c 文件。因此,如果 classroom.h 文件使用前两个标头中声明的内容,则需要在{strong> <中放置#include "student.h"#include "subject.h" EM> classroom.h

如果只有 classroom.c 也使用标题中声明的内容,请仅在此处放置包含,但不在 classroom.h中放置< / EM>

最后,如果两个文件都使用标题中声明的内容,请将#include "student.h"#include "subject.h"放在两个文件中。

基本上,您将包含在标题中需要资源定义(但未实现)的文件中。通过让您的头部被上面的代码包围,您基本上可以将包含放在许多文件中,并且在编译过程中永远不会重复代码。

关于sum()PI。一样。使用上面的代码制作标题,并将其包含在需要这些内容的地方。

答案 1 :(得分:2)

因此,“x.h”和“x.c”(或“x.cpp”)的组织是一种相当标准的做事方式。但是有些东西不合适,有时你需要一个“constants.h”或其他名称来代替PISpeedOfLight

sum这样的东西可以很好地融入“utils.h” - 你是否有足够的资源使其值得拥有“utils.c”

您的.c文件应包含所需的所有头文件(但不能包含)。

例如:

#ifndef X_H__
#define X_H__
 ...  
 all the contents of x.h goes here 
 ... 
#endif

头文件应包含他们自己需要的所有内容。因此,例如,如果“x.h”需要“a.h”和“b.h”,则“x.h”中应该有#include "a.h"#include "b.h",因此您不必记住:

  

如果我包含“x.h”,我必须在其前加上“a.h”和“b.h”。

与此同时,不要添加超出实际需要的数量......

答案 2 :(得分:2)

你的问题主要是关于风格 人们可以充其量只给你一般意见。

我认为每个文件都必须有一个具体的工作要做,或者很好地定义一个具体的对象及其相关的操作 必须以简单的方式描述“工作”:

  • 用于一般用途(简单)例程和/或宏和/或常量的文件。
  • 字符串句柄的文件。
  • 整数运算的文件。
  • 用于I / O操作的文件。
  • 用于用户界面和/或互动的文件。
  • 等......

您可以分离不同类型的作业越多,标题的组织就越好。

  • 如果您有疑问,请问问自己这些或那些功能是否可以应用于其他程序,这些程序与您当前的项目性质不同。如果你有一个宏/函数/数据列表,你可能会在非常不同的程序中使用,独立的一组其他程序,那么前者很可能必须被分组在同一个头文件中。

“对象”通常必须由 struct
来描述 具体而且易于理解的“操作”(即函数)明确地作用于 struct

最后,您可以编写一个或两个主文件,以收集和关联项目所需的所有文件。

一般来说,我打算让main.c文件尽可能短,
作为控制该计划其余部分的乐团指挥。

通过在每个文件中写清楚和好的评论,
该文档允许您处理具有在任何地方传播的多个文件的项目。

您必须解释:

  • 该文件的目的是什么,
  • 那里定义的数据和功能是什么,
  • 如何使用这些功能,
  • 可以预期的结果,
  • 这是这些结果的含义,
  • 等等。

如果你尝试做这个练习,向你解释你的头文件应该做什么,以及如何做,你会很快看到那里有没有意义。

答案 3 :(得分:0)

您应该在实现文件中包含头文件。

通常,您应该在头文件中包含尽可能少的头文件。仅包含类型等所需的标题。然后,在实现文件中,您可以包含头文件中所需函数所需的所有标题。

所以在你的情况下,这取决于你需要学生和科目。如果你只需要在实现文件中将它包含在那里,如果你需要它,你可以在那里包含它,当你包含对应于实现文件的头时它将包含在实现文件中。