C标头文件包含在另一个标头文件中,并且都包含在c文件中

时间:2019-11-16 09:15:46

标签: c header main

我对C语言中的头文件有一个疑问。假设我有一个头文件,其中包含一个名为cars.h的结构汽车,如下所示:

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;

现在,假设我还有另一个文件,但这一次是一个名为main.c的C文件,如下所示:

#include "cars.h"
#include "drivers.h"

int main() {
    car c;
    driver bob;
    bob.own_car = c;
    return 0;
}

您能解释为什么这是错误的,我该怎么做以防止出现任何错误?

谢谢!

2 个答案:

答案 0 :(得分:2)

问题是同一头文件可能被多次包含。如何防止在代码中多次包含相同的头文件?您可以将其添加到头文件中:

对于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

答案 1 :(得分:1)

包含的结果是为编译器制作了一个大文件。由于您已经在drivers.h中包含cars.h,但是在.c文件中您再次包含cars,因此最终将文件包含两次。这将导致编译器看到双重定义,尽管相同,但可能会抱怨这个双重定义。

一种解决方案是在包含文件中包含所谓的“包含防护”,如果以前包含该内容,则这些内容将不可见。只需在Google或本网站上查找“包括卫兵”即可。

更好的解决方案是知道模块的incldue结构并正确包含文件,在这种情况下,仅包含driver.h。