在给定的 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)
{
...
}
我无法理解 Grade
、Subject
、Student
和 lastErrNo
前向声明的目的是什么?为什么不立即用它们的定义替换它们?
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?
您可以在使用它们之前定义它们,而不是向前声明。这只是代码组织的问题。
我被分配了一项任务来维护遗留 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)
{
...
}
我无法理解 Grade
、Subject
、Student
和 lastErrNo
前向声明的目的是什么?为什么不立即用它们的定义替换它们?
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?
您可以在使用它们之前定义它们,而不是向前声明。这只是代码组织的问题。