避免重复包含头文件的做法
众所周知,为了避免重复包含头文集,会使用这样的用定义来避免重复包含头文件。
#ifndef xxx_H
#define xxx_H
//头文件内容
#endif
在第一次#include这个头文件时,会#define xxx_H,在之后的重复包含的头文件时会由于#ifndef xxx_H不再包含头文件的内容,从而避免头文件重复包含。需要注意的是不同头文件#define xxx_H的内容需要不同,不然只能包含第一个头文件。
嵌套包含导致缺少定义
例如这三个文件有这样的包含关系:
\\asm330lhh.h
#include "bsp_spi_union.h"
void asm330lhh_Init(bsp_spi_union_handler *handler);\\这里提示bsp_spi_union_handler未定义
\\bsp_spi_union.h
#include "bsp.h"
typedef struct {
void (*spi_cs_active)(void);
void (*spi_cs_inactive)(void);
CM_SPI_TypeDef *spi;
}bsp_spi_union_handler;
\\bsp.h
#include "asm330lhh.h"
#include "bsp_spi_union.h"
在包含了bsp_spi_union.h的源文件中会出现报错,没有bsp_spi_union_handler的定义。这是由于bsp.h会先#include “asm330lhh.h”导致bsp_spi_union_handler出现在定义之前导致报错。最简单的解决方法是将bsp.h的#include “bsp_spi_union.h”提到#include “asm330lhh.h”前面去,最佳办法是将bsp_spi_union.h的bsp_spi_union_handler定义提到包含头文件之前。
在MDK中查看预处理器产生的中间文件(*.i)
在Options for Target ‘xxx’的Listing面板中勾选C Preprocessor Listing: .\Listings*.i即可在对应文件夹中查看预处理器后的文件,这些文件的宏定义都是展开了的,因此在不清楚宏定义是怎么展开的情况下可以使用这种方法。