stm32中#ifndef __LED_H的作用

来源:互联网 发布:linux php.ini 编辑:程序博客网 时间:2024/06/05 16:46

下面是来至网络上比较详尽的解答

先回答你的问题。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 一样,都是通过判断表达式是否为真,来决定往下的程序段是否被编译。
0 0
原创粉丝点击