找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9622|回复: 1
打印 上一主题 下一主题
收起左侧

关于头文件中#ifndef的理解

[复制链接]
跳转到指定楼层
楼主
ID:89763 发表于 2015-9-10 00:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题:
如果没定义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 一样,都是通过判断表达式是否为真,来决定往下的程序段是否被编译。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:350791 发表于 2018-8-2 09:50 | 只看该作者
学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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