关于头⽂件中#ifndef的理解
关于头⽂件中#ifndef的理解
问题:
如果没定义LED.h
那这句能不能写成#ifndef LED.H
__LED_H 这⼏个横杆都是什么意思啊
回答:
楼主你好。
先回答你的问题。
define的基本用法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 ⼀样,都是通过判断表达式是否为真,来决定往下的程序段是否被编译。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。