在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误。
例如:假设你的工程里面有4个文件,分别是 a.cpp , b.h, c.h, d.h。a.cpp的头部是:#include "b.h "#include "c.h "b.h和c.h的头部都是:#include "d.h "而d.h里面有int a,即a的定义。这样一来,编译器编译a.cpp的时候,先根据#include "b.h "去编译b.h这个文件,再根据b.h里面的#include "d.h ",去编译d.h的这个文件,这样就把d.h里面的int a编译了;然后再根据a.cpp的第二句#include "c.h ",去编译c.h,最终还是会找到的d.h里面的int a,但是int a之前已经编译过了,所以就会报重定义错误。
作用:在头文件中使用#ifndef #define #endif能避免头文件的重定义。
使用方法:例如要编写头文件stm32f10x.gpio.h
在头文件开头写上两行:
#ifndef _STM32F10X_GPIO_H
#define _STM32F10X_GPIO_H //一般是文件名的大写
头文件结尾写上一行:#endif
这样一个工程文件里同时包含两个stm32f10x.gpio.h时,就不会出现重定义的错误了。
分析:当第一次包含stm32f10x.gpio.h时,由于没有定义 _STM32F10X_GPIO_H,条件为真,这样就会包含(执行
)#ifndef _STM32F10X_GPIO_H和#endif之间的代码,当第二次包含stm32f10x.gpio.h时前面一次已经定义了_STM32F10X_GPIO_H,条件为假,#ifndef _STM32F10X_GPIO_H和#endif之间的代码也就不会再次被包含(执行),这样就避免了重定义了。主要用于防止重复定义宏和重复包含头文件。