2013-08-22 22 views
4

我组织了我的程序,将每个实体分割到它自己的文件中。 这是这样的。如何在文件中正确拆分C程序并包含它?

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东西,被所有的然后像总和()PI

它是如何包括头实现的正确途径或者在实现文件中包含头文件?并且我应该包含头文件还是实现文件?

如果我把所有东西扔在一个文件上,它编译得很好,但我没有这样做,它不能编译。

回答

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 

头文件应包含他们自己需要的所有东西。因此,举例来说,如果“XH”需要“啊”和“BH”,应该有#include "a.h"和“XH”,所以你不必记住#include "b.h"

如果我有“XH”我必须把“啊”和“bh”放在它之前。

同时,不增加更多的包括比实际需要...

+0

参数“头文件应该包括他们自己需要的所有东西”是非常有用的,所以使用的东西,但不需要任何声明,例如'strcpy()',我应该只包含'string.h'在'xc'文件中,而不是'xh'中,对吗? –

+0

是的,如果你使用'strcpy()'在“x.h”中没有'inline'函数,那么就不需要“x.h”来包含“string.h”。 –

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代码将只在程序中存在一次。

现在。你在哪里放置你的#包括?好吧,我假设student.hsubject.h文件会声明是在student.csubject.c文件中实现的东西。因此,如果classroom.h文件使用前两个头部宣布的事情,那么你需要将#include "student.h"#include "subject.h"classroom.h

如果只classroom.c也使用在头宣布的事情,将只包括在这里,但不是在教室。h

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

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

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

2

你的问题主要是关于风格。
人们可以给你一般的意见,至多。

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

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

你越能区分不同类型的工作,更好的是你的头的组织。

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

“对象”必须由结构
和混凝土和很好地理解“操作”(即,函数)对结构明确作用通常被描述。

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

一般来说,我打算尽可能缩短main.c档案,
作为控制程序其余部分的管弦乐导演。

通过在每个文件中写下清晰且漂亮的评论,
该文档使您可以处理具有多个文件的任何位置的项目。

您必须解释:

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

如果你试图做这个练习,解释别人你的头文件应该做什么,以及如何,你会很快看到是否有什么没有意义。

相关问题