如何在 C 中创建模块

Posted

技术标签:

【中文标题】如何在 C 中创建模块【英文标题】:How to create module in C 【发布时间】:2021-04-27 18:20:23 【问题描述】:

我需要 C 模块方面的帮助。

我制作了一个小经理系统,用于保存有关学校科目的记录。我在一个(main.c) C 文件中有我的saveToFilereadFromFile 函数。现在我被要求创建一个用于读写功能的模块。我创建了 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.cfile.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?

如何在 TypeScript 中创建本地模块

如何在 emacs 中创建一个空文件?

如何在 PyCharm 中创建模块并将其导入?

在 Terraform 中,如何在包含的模块中引用根模块中创建的组件

如何在 IntelliJ IDEA 中创建 JavaFX 模块