C 头文件包含在另一个头文件中,并且都包含在 c 文件中
C Header file being included in another header file and both included in a c file
我对 C 中的头文件有疑问。假设我有一个头文件,其中包含一个名为 cars.h
的结构体 car,如下所示:
typedef struct car_s {
string plate;
string model;
} car;
现在,我有另一个包含上述头文件的头文件,名为drivers.h
,如下所示:
#include "cars.h"
typedef struct driver_h
{
string id;
string name;
car own_car;
} driver;
现在,假设我有另一个文件,但是这次是一个C文件,叫做main.c
,如下:
#include "cars.h"
#include "drivers.h"
int main() {
car c;
driver bob;
bob.own_car = c;
return 0;
}
你能解释一下为什么这是错误的吗?我该怎么做才能防止出现任何错误?
谢谢!
包含的结果是为编译器制作了一个大文件。由于您已经在 drivers.h 中包含了 cars.h,但是在您的 .c 文件中您再次包含了汽车,因此您最终会包含两次该文件。这将导致编译器看到双重定义,虽然相同,但可能会抱怨这个双重定义。
一种解决方案是在您的包含文件中添加所谓的 "include guards",如果之前包含的内容不会使内容可见。只需使用 google 或在此站点上查找 "include guards"。
更好的解决方案是了解模块的包含结构并正确包含文件,在本例中仅包含 drivers.h。
问题是同一个头文件可能被包含多次。您可以做些什么来防止在您的代码中多次包含相同的头文件?您可以在头文件中添加:
对于cars.h
:
#ifndef CARS_H
#define CARS_H
typedef struct car_s{
stringplate;
string model;
}car;
#endif
这将检查这个头文件是否已经被包含,如果是它不会再包含它,如果不是那么它现在将被包含。
你对 drivers.h
做同样的事情:
#ifndef DRIVERS_H
#define DRIVERS_H
#include "cars.h"
typedef struct driver_h
{
string id;
string name;
car own_car;
}
#endif
我对 C 中的头文件有疑问。假设我有一个头文件,其中包含一个名为 cars.h
的结构体 car,如下所示:
typedef struct car_s {
string plate;
string model;
} car;
现在,我有另一个包含上述头文件的头文件,名为drivers.h
,如下所示:
#include "cars.h"
typedef struct driver_h
{
string id;
string name;
car own_car;
} driver;
现在,假设我有另一个文件,但是这次是一个C文件,叫做main.c
,如下:
#include "cars.h"
#include "drivers.h"
int main() {
car c;
driver bob;
bob.own_car = c;
return 0;
}
你能解释一下为什么这是错误的吗?我该怎么做才能防止出现任何错误?
谢谢!
包含的结果是为编译器制作了一个大文件。由于您已经在 drivers.h 中包含了 cars.h,但是在您的 .c 文件中您再次包含了汽车,因此您最终会包含两次该文件。这将导致编译器看到双重定义,虽然相同,但可能会抱怨这个双重定义。
一种解决方案是在您的包含文件中添加所谓的 "include guards",如果之前包含的内容不会使内容可见。只需使用 google 或在此站点上查找 "include guards"。
更好的解决方案是了解模块的包含结构并正确包含文件,在本例中仅包含 drivers.h。
问题是同一个头文件可能被包含多次。您可以做些什么来防止在您的代码中多次包含相同的头文件?您可以在头文件中添加:
对于cars.h
:
#ifndef CARS_H
#define CARS_H
typedef struct car_s{
stringplate;
string model;
}car;
#endif
这将检查这个头文件是否已经被包含,如果是它不会再包含它,如果不是那么它现在将被包含。
你对 drivers.h
做同样的事情:
#ifndef DRIVERS_H
#define DRIVERS_H
#include "cars.h"
typedef struct driver_h
{
string id;
string name;
car own_car;
}
#endif