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