我对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;
}
您能解释为什么这是错误的,我该怎么做以防止出现任何错误?
谢谢!
答案 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。