如何正确拆分文件中的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.hclassroom.c中包含这个吗?

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

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

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

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

所以“xh”和“xc”(或“x.cpp”)的组织是一种相当标准的做事方式。 但有些东西不适合那里,有时你需要一个“constants.h”或其他一些名字,比如PISpeedOfLight

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

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

例如:

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

头文件应该包含他们自己需要的所有东西。 例如,如果“xh”需要“ah”和“bh”,那么“xh”中应该有#include "ah"#include "bh" ,所以你不必记住:

如果我包含“xh”,我必须在其前加上“ah”和“bh”。

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

第一。 有关.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 

为什么要这个? 如果要在多个其他文件file1.cfile2.c中包含头文件(例如header.h) ,则基本上会重复代码,这意味着在编译期间header.h中的代码将放在两个文件中处理。

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

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

如果只有classroom.c也使用标题中声明的内容,则只将这些包括在此处,而不是在classroom.h中

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

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

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

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

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

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

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

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

必须通过结构来描述“对象”,
具体而且易于理解的“操作”(即函数)明确地作用于该结构

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

一般来说,我打算保持main.c文件尽可能短,
作为控制其余节目的乐团指挥。

通过在每个文件中写清楚和好的注释,
该文档使您可以处理具有在任何地方传播的多个文件的项目。

你必须解释:

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

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

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

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

所以在你的情况下,这取决于你需要学生和主题。 如果您只需要在实现文件中将其包含在那里,并且如果您需要它在标题中,则可以将其包含在那里,当您包含与实现文件对应的标题时,它将包含在实现文件中。