重复包含、未包含头文件内容的问题

避免重复包含头文件的做法

众所周知,为了避免重复包含头文集,会使用这样的用定义来避免重复包含头文件。

#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即可在对应文件夹中查看预处理器后的文件,这些文件的宏定义都是展开了的,因此在不清楚宏定义是怎么展开的情况下可以使用这种方法。
勾选C Preprocessor Listing: .\Listings*.i

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇