发 帖  
请问如何理解头文件中的#ifndef?
2018-7-6 03:34:23  193 头文件 LED
收藏 0 收藏 推荐 0 推荐
分享
问题:
如果没定义LED.h
那这句能不能写成#ifndef LED.H
__LED_H 这几个横杆都是什么意思啊

回答:
楼主你好。
先回答你的问题。
1 是可以写成 LED.H只不过你接下来要写一句#defined LED.H
因为#ifndef 后面的字符串 不管是 LED.H还是__LED_H和头文件的名字没有半毛钱关系。只不过是为了读程序的时候方便而已。其实那个字符串只要合法的就行了。
2 用法
#ifndef 字符串
#define 上述字符串
#endif
一般放在头文件里面,作用就是以防你在.c文件里面不小心重复包含头文件的时候不会报错。
例如,现在你有 main.c LED.H 两个文件。
如果你在main函数里面两次包含头文件LED.H。即
#include “LED.h”
#include “LED.h”
int main(void)
{
return 0;
}
那么你的程序肯定会报错。因为你的头文件重复添加了。
但是如果你在LED.H里面动一点手脚就把问题解决了,在LED.H添加如下代码
#ifndef abcdefg
#define abcdefg
#include "stm32f10x.h"
void led_init(void);
...//其他函数声明
#endif
就可以把问题解决。
分析如下:#ifndef 的是if no define----”如果没有定义“的意思。带#的是预编译命令,在编译之前执行。
如果没有定义abcdefg 那么就#define abcdefg 定义了abcdefg
当你多次包含LED.H这个头文件的时候。第一次肯定是没有定义的,所以肯定会执行
#define abcdefg 但是第二次,第三次,..以后再包含的时候,由于第一次已经定义过了abcdefg字符串,所以第二次的#ifndef abcdefg 不成立,所以往下的语句就不会执行。那么就不会重复包含头文件了。也不会把头文件里面声明过的函数再继续重复声明了。也就不会报错了。所以记住一点:#ifndef 在头文件里的用法是通过判断这个字符串是否被定义过,从而决定是否跳过某些语句来达到,条件编译,防止报错的效果的。

当然条件编译的用处很灵活看你怎么用。给楼主总结一下3种条件编译
第一种:
#if 表达式
程序段1
#endif

第二种:
#ifndef 表达式
程序段2
#endif

第三种
#ifdefine 表达式
程序段3
#endif

以上是三种基本的条件编译,当然可以嵌套。还可以加#elsedefine 不过elsedefine的宏命令简写我忘记是什么了,哈哈。所以就不贴上了。反正用法和if-else 一样,都是通过判断表达式是否为真,来决定往下的程序段是否被编译。

2018-7-6 03:34:23   评论

只有小组成员才能发言,加入小组>>

214个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表