4

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

main.c

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

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

学生.h

typedef struct st student;

学生.c

#include "student.h"

主题.h

typedef struct sb subject;

主题.c

#include "subject.h"

教室.h

typedef struct cr classroom;

教室.c

#include "classroom.h"

我的问题是,在教室里我需要学生学科。我应该如何包括这个?我应该将它包含在教室.h教室.c中吗?

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

其次,我在main.c上有一些东西被所有人使用,比如sum()PI

在头文件中包含实现或在实现文件中包含头文件的正确方法是什么?我应该包含头文件还是实现文件?

如果我将所有内容都放在一个文件上,它编译得很好,但我做的不对,它不会编译。

4

4 回答 4

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.cfile2.c中,您基本上会重复代码,这意味着header.h中的代码将在编译期间放置在两个文件中过程。

拥有这些预处理器指令可以确保header.h中的代码在程序中只存在一次。

现在。你把你的#includes放在哪里?好吧,我假设student.hsubject.h文件将声明在student.csubject.c文件中实现的内容。因此,如果教室.h文件使用前两个标题中声明的内容,那么您需要将#include "student.h"#include "subject.h"放在教室.h中。

如果只有教室.c也使用标题中声明的内容,则仅将包含放置在此处,而不是在教室.h中。

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

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

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

于 2013-08-22T23:00:11.730 回答
2

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

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

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

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

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

“对象”通常必须由struct描述,
并且具体且易于理解的“操作”(即函数)显式地作用于该struct

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

总的来说,我打算使main.c文件尽可能短,
作为管弦乐队指挥控制程序的其余部分。

通过在每个文件中编写清晰而漂亮的注释,
该文档可以让您处理一个项目,其中多个文件分布在任何地方。

你必须解释:

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

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

于 2013-08-23T03:50:11.803 回答
2

所以“xh”和“xc”(或“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" 需要 "ah" 和 "bh",那么 "xh" 中应该有#include "a.h"and#include "b.h"这样你就不必记住:

如果我包括“xh”,我必须在它前面加上“ah”和“bh”。

同时,不要添加比实际需要更多的包含...

于 2013-08-22T22:57:19.693 回答
0

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

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

因此,就您而言,这取决于您需要学生和科目。如果您只需要在实现文件中包含它,并且如果您需要在头文件中包含它,则可以将它包含在其中,当您包含与实现文件对应的头文件时,它将包含在实现文件中。

于 2013-08-22T22:52:04.873 回答