头文件中的#ifndef与#endif有什么用?为什么头文件里必须要有?

目录

前言

是什么意思?

为什么要用在头文件里?

为什么可以防止双重定义?

注意点


前言

我们在学习单片机的时候,创建好源文件以后,在创建头文件时,第一步总是先来一手#ifdef与#endif,不清楚原因的同学往往就是按部就班的写上这些代码,糊里糊涂。这篇文章就以通俗易懂的语言来为大家解开这个疑惑。

是什么意思?

不清楚为什么在创建头文件后第一步总是先来一手#ifdef与#endif的同学大概是C语言没有学到“条件编译”。说的也就是我自己,我大一学C语言学到后面以后心急想去实操项目,C语言后面的内容也就学的囫囵吞枣了,这样不太好,C语言是嵌入式的基础,一定要学扎实了。

条件编译:一般情况下,源程序所有的行都参与编译。但是有时希望对其中一部分内容只有满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。

有时 ,希望当满足条件时对一组语句进行编译,当条件不满足时则编译另一条语句。
条件编译命令最常见的形式为:

#ifdef 标识符 程序段1
#else 程序段2
#endif

它的作用是:当标识符已经被定义过(一般用#define命令定义),则对程序段1进行编译,否则编译程序段2

其中#else部分也可以没有,即:

ifdef 程序段1
endif

为什么要用在头文件里?

在头文件中使用#ifdef和#ifndef是非常重要的,可以防止双重定义或者头文件被多次包含的错误,在keil中,程序有双重定义时,编译以后是会报错的。

为什么可以防止双重定义?

这里的双重定义指的是双重定义变量或者在源文件中重复包含同一个头文件。

为什么可以防止这种问题?大家动用自己的脑袋瓜子想一想,我们在编写头文件里的程序是,会在头文件中写一些什么代码?

这里小编给大家看看一个典型的头文件程序,方便大家对比理解:

(1)通过上面这个头文件可以发现,头文件中经典的条件编译格式如下:

#ifndef 标识符

#define 标识符

程序段

#endif

(2)意思是,如果没有定义"标识符",那就定义"标识符"和执行程序段,如果之前已经定义过了"标识符",那所有代码都不执行了。放到上面的头文件示例中理解一下,如果之前没有定义标识符__MPU6050_H,那就执行代码直到#endif;但是如果之前定义过了__MPU6050_H,那么整个头文件中的程序都不会执行。

(3)而程序段中往往是一些定义其他变量、标识符的语句,通过这种条件编译的方式,就有效的防止了重复定义一些变量、标识符。同时我们在写代码的时候,经常会在源文件中多次包含同一个头文件,这种操作也防止了多次包含头文件后编译的错误。

注意点

"__标识符"在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

#ifndef __STDIO_H
#define __STDIO_H
…
#endif

码字不易,希望喜欢的小伙伴别忘了点赞+收藏+关注,你们的肯定就是我创作的动力。

欢迎大家积极交流,本文未经允许谢绝转载!!!

猜你喜欢

转载自blog.csdn.net/weixin_62261692/article/details/130691425