将保存/加载函数分解为模块(.c、.h、.o)文件

将保存/加载函数分解为模块(.c、.h、.o)文件,c,function,C,Function,我的项目有一个任务,我必须把我的保存和加载函数写在不同的模块中。听起来像这样- 在不同的.c文件中编写这些函数,创建用于处理该模块的头文件(.h)和目标文件(.o) 我几乎没有使用这些头文件和对象文件的经验,我不清楚为什么我需要它们 我的理解是,我只是将这些保存/加载函数粉碎成一个不同的.c文件,并将其包含在我的主程序中,(.h)和(.o)文件的用途是什么?我在上面写什么 以下是我的职能: int loadUsersData(int balance) { int size, savedB

我的项目有一个任务,我必须把我的保存和加载函数写在不同的模块中。听起来像这样-

在不同的
.c
文件中编写这些函数,创建用于处理该模块的头文件(
.h
)和目标文件(
.o

我几乎没有使用这些头文件和对象文件的经验,我不清楚为什么我需要它们

我的理解是,我只是将这些保存/加载函数粉碎成一个不同的
.c
文件,并将其包含在我的主程序中,(
.h
)和(
.o
)文件的用途是什么?我在上面写什么

以下是我的职能:

int loadUsersData(int balance) {
    int size, savedBalance;
    FILE *f;
    f = fopen("save.bin", "rb");
    fseek (f, 0, SEEK_END);
    size = ftell(f);
    fseek(f, 0, SEEK_SET);
    if(size != 0) {
        fread(&savedBalance, sizeof(int), 1, f);
        balance = savedBalance;
    }
    fclose(f);
    return balance;
}
以及:

我不清楚为什么我需要它们

您需要头文件来获取函数原型和其他声明

是的,您可以使用main方法在主文件中包含一个.c文件。这将产生几个影响:

  • 你会得到一个巨大的,可能超过几十万/数百万行的代码。重新编译需要很长时间
  • 您将编译相同的函数times==>多个定义,尽管这可以通过使用
    static
    来修复
  • 另一种用法是封装:

    struct someOpaqueType;
    typedef struct someOpaqueType * OpaqueType;
    
    这表明,头文件的用户不应该关心/查看
    struct someOpaqueType
    的内容

    (.h)和(.o)文件的用途是什么

    头文件(.h)包含定义、声明和函数原型

    对象文件(.o)包含未链接到可执行文件的已编译C代码。如果使用
    -c
    (gcc/clang),则这些是输出文件格式。 此外,它还包含调试信息、重新定位数据等内容

    我在上面写什么

    比如说

    #ifndef USER_DATA //This include guard is there to make it only included once per translation unit.
    #define USER_DATA
    //Function protoype.
    int loadUsersData(int);
    void saveUsersData(int);
    #endif
    
    或者,如果要使用非标准扩展,请执行以下操作:

    #pragma once
    int loadUsersData(int);
    void saveUsersData(int);
    
    我不清楚为什么我需要它们

    您需要头文件来获取函数原型和其他声明

    是的,您可以使用main方法在主文件中包含一个.c文件。这将产生几个影响:

  • 你会得到一个巨大的,可能超过几十万/数百万行的代码。重新编译需要很长时间
  • 您将编译相同的函数times==>多个定义,尽管这可以通过使用
    static
    来修复
  • 另一种用法是封装:

    struct someOpaqueType;
    typedef struct someOpaqueType * OpaqueType;
    
    这表明,头文件的用户不应该关心/查看
    struct someOpaqueType
    的内容

    (.h)和(.o)文件的用途是什么

    头文件(.h)包含定义、声明和函数原型

    对象文件(.o)包含未链接到可执行文件的已编译C代码。如果使用
    -c
    (gcc/clang),则这些是输出文件格式。 此外,它还包含调试信息、重新定位数据等内容

    我在上面写什么

    比如说

    #ifndef USER_DATA //This include guard is there to make it only included once per translation unit.
    #define USER_DATA
    //Function protoype.
    int loadUsersData(int);
    void saveUsersData(int);
    #endif
    
    或者,如果要使用非标准扩展,请执行以下操作:

    #pragma once
    int loadUsersData(int);
    void saveUsersData(int);
    

    这是你的C课本上的一个问题。有一点是,这个
    *.o
    没有多大意义,因为它是编译的输出,并且通常不“维护”。这是C教科书中的一个问题。有一件事是,这个
    *.o
    没有多大意义,因为它是编译的一个输出,并且通常不“维护”。