如何在 C 中创建模块
Posted
技术标签:
【中文标题】如何在 C 中创建模块【英文标题】:How to create module in C 【发布时间】:2021-04-27 18:20:23 【问题描述】:我需要 C 模块方面的帮助。
我制作了一个小经理系统,用于保存有关学校科目的记录。我在一个(main.c)
C 文件中有我的saveToFile
和readFromFile
函数。现在我被要求创建一个用于读写功能的模块。我创建了 SavingFunctions.c
SavingFunctions.h
并且我被要求创建一个目标文件 .o
但如果我需要将它写给自己或什么都不做,我不明白,因为我看到一些带有 .o 的文件我的文件夹。另外,我使用结构,也许我需要将它放在一个单独的文件中?
SavingFunctions.c
#include <stdio.h>
#include <stdlib.h>
#include "SavingFunctions.h"
//READ_FUNCTION
int numberOfRecords(struct Subjects DataBase[])
FILE *fp = NULL;
fp = fopen("file.bin", "rb");
if(fp == NULL)
printf("Error! Failed to open\\find the file. \n");
exit(1);
int i=0;
//Reads the contents of a structure variable from file
while(fread(&DataBase[i], sizeof(DataBase[i]),1, fp) == 1)
++i;
fclose(fp);
return i;
//WRITE_FUNCTION
void writeTofile(struct Subjects DataBase[], int positionToWrite)
int recordsNumber;
FILE *fp;
fp = fopen("file.bin", "wb");
if(fp == NULL)
printf("Error! Failed to open or find the file.\n");
exit(1);
recordsNumber = 0;
for(int i=0; i<=positionToWrite;++i)
fwrite(&DataBase[i], sizeof(Subjects), 1, fp);
recordsNumber++;
fclose(fp);
printf("Total number of items in the file: %d\n", recordsNumber);
SavingFunctions.h
typedef struct Subjects
char Lesson[20];
char TeachersName[20];
char TeachersLastName[20];
int Credits;
int NumberOfStudents;
Subjects;
#ifndef SAVINGFUNCTIONS_H
#define SAVINGFUNCTIONS_H
int numberOfRecords(struct Subjects DataBase[]);
void writeTofile(struct Subjects DataBase[], int positionToWrite);
#endif
【问题讨论】:
结构应该在#ifndef
/ #endif
块内定义(在#define
行之后)。通常,file.c
和 file.h
是一对 — 除非标头声明在多个不同源文件中定义的材料,否则两者使用相同的文件名前缀。
您“接受”更改,无需对其进行编辑 - 无需采取进一步行动。尝试确保您正在编辑当前版本,但如果有几个人同时编辑问题,这有时会很困难。仅供参考,我倾向于使用###
标记子标题;单个#
标题比我喜欢的更强调。然而,这是一个品味问题。
@JonathanLeffler 但如果我在 #ifndef / #endif 之间将结构放入 SavingFunctions.h 并放入 main.c 中,则会出现错误。可能是什么问题?
不要那样做——不要在几个不同的地方定义结构。在需要结构的地方包括标题。干燥——不要重复自己。
【参考方案1】:
.o
文件称为目标文件。如果您使用 gcc(没有选项 -o
)编译源文件,则会在源文件的相同位置创建扩展名为 .o
的目标文件。要为目标文件指定特定名称,您必须指定 -o
选项,例如:
gcc -c -o module_name SavingFunctions.c
就像在下面的评论部分中指出的那样,您没有 main 函数。因此,您必须添加一个 -c 选项(用于编译)。之后,您可以将目标文件链接在一起以创建库或可执行文件(带有 main 函数)。或者使用其他答案中提到的其他方法。
【讨论】:
由于模块中没有main()
函数(也不应该有),因此至少需要两个目标文件(或源文件,或源文件和源文件的混合)目标文件)在(编译和)链接命令行上列出。或者需要将模块放入库中,然后将程序与该库链接。【参考方案2】:
您不必担心.o
文件。它是一个已编译的文件,可以由链接器链接到可执行文件中。
使用命令行中列出的所有 .c
文件简单运行 gcc。
$ gcc -Wall main.c SavingFunctions.c -o executable_name
其中executable_name
是创建程序的名称,'main.c' 是包含main
函数定义的源文件。
然后运行程序./executable_name
。
守卫应该保护整个 .h 文件,所以你的应该是
#ifndef SAVINGFUNCTIONS_H
#define SAVINGFUNCTIONS_H
typedef struct Subjects
char Lesson[20];
char TeachersName[20];
char TeachersLastName[20];
int Credits;
int NumberOfStudents;
Subjects;
int numberOfRecords(struct Subjects DataBase[]);
void writeTofile(struct Subjects DataBase[], int positionToWrite);
#endif
【讨论】:
以上是关于如何在 C 中创建模块的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BuildSrc 中创建 FlavorConfig?