在给定的 C 代码片段中进行前向声明的目的是什么?

What is the purpose of having the forward declarations in the given fragment of C code?

我被分配了一项任务来维护遗留 CGI 程序,该程序将数据添加到大学数据库。该程序由单个文件组成,编译时没有警告。该文件使用如下所示的前向声明。

#define MAX_NAME_LEN 50

enum Grade;
enum Subject;
struct Student;
...

int lastErrorNo;

void addGrade (enum Subject subj, enum Grade g, struct Student *stud);
void editGrade (enum Subject subj, enum Grade g, struct Student *stud);
...

enum Grade {
    A = 0,
    B,
    C,
    D,
    E
};

enum Subject {
    Calculus1 = 0,
    Calculus2,
    ...
    Mechanics
};

struct Student
{
    char lastName[MAX_NAME_LEN];
    char firstName[MAX_NAME_LEN];
    ...
};

static int lastErrorNo = 0;

int main(void) {
    ...
}

void addGrade (enum Subject subj, enum Grade g, struct Student *stud)
{
    ...
}

void editGrade (enum Subject subj, enum Grade g, struct Student *stud)
{
    ...
}

我无法理解 GradeSubjectStudentlastErrNo 前向声明的目的是什么?为什么不立即用它们的定义替换它们?

I can't understand what is the purpose of the forward declarations of Grade, Subject, Student and lastErrNo?

关于枚举,编译器必须知道变量才能使用它们,因为您在函数前向声明中使用它们,编译器需要知道这些类型是什么。

全局声明 int lastErrorNo; 的原因可能是作为全局错误标志保留,但由于稍后它被重新声明为 static 也是全局的,因此代码将不会由于重新声明而编译,可能是打字错误?

Why not to immediately replace them with their definitions?

您可以在使用它们之前定义它们,而不是向前声明。这只是代码组织的问题。