OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17109|回复: 31

为什么要在头文件里输入#ifndef __LED_H这段代码

[复制链接]

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2012-8-23
在线时间
0 小时
发表于 2012-8-24 14:22:16 | 显示全部楼层 |阅读模式
看了原子哥的程序我觉得看了很清楚,这样的写法是不是可以用在51上面。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2014-11-15
在线时间
91 小时
发表于 2016-1-2 13:01:23 | 显示全部楼层
.h头文件并不是直接对应执行的,.c和.h都是给编译器看的,而.h的写法只是一种C编程的规范,实际在编译时,会直接替换掉.c代码中的#include <......>。

如果没有了#ifndef __XXX_H  #define __XXX_H <......> #endif,那么一个.c代码中如果包含了一些头文件,而这些头文件如果又都包含了同一个.h头文件,那么编译器实际上就等于在一段代码中看到了很多重复的定义、**,就要报错了。

不知,我说清楚了没有!
回复 支持 5 反对 0

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-1
在线时间
3 小时
发表于 2019-8-13 17:13:12 | 显示全部楼层
为啥看不到20楼 我fo了
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-24 19:14:55 | 显示全部楼层
回复【6楼】zjxuchu:
---------------------------------
那你就这样用吧.
当你工程大了,我看你怎么搞...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-24 14:25:00 | 显示全部楼层
可以的.
这个宏定义主要是防止重复包含.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2012-8-24 16:15:55 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我们能不能不建立.c文件直接把代码写在.h文件里在添加到main函数里面那样不是更简单么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-24 17:17:00 | 显示全部楼层
回复【3楼】zjxuchu:
---------------------------------
你试试就知道不可行.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-8-22
在线时间
0 小时
发表于 2012-8-24 17:18:18 | 显示全部楼层
回复【3楼】zjxuchu:
回复【2楼】正点原子: --------------------------------- 我们能不能不建立.c文件直接把代码写在.h文件里在添加到main函数里面那样不是更简单么
---------------------------------
有想法!
支持!!
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2012-8-24 19:03:57 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
可行的 我试过了。
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2012-8-24 19:35:18 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
也对,工程大了如果程序都在头文件里的话每次改动都要全部编译一遍是很麻烦
回复 支持 反对

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2012-6-5
在线时间
0 小时
发表于 2012-8-24 21:18:02 | 显示全部楼层
呵呵,我也是以前对头文件的理解有误,做了跟楼主想法一样的事,把代码直接写在.h文件里。这样的结果是如果main函数没有调用.h文件里所有的函数,编译器就会报一大堆警告,虽然不影响程序的运行,但是看的别扭。而且这样的做法违背了头文件本来的的功能。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-8-24
在线时间
1 小时
发表于 2012-8-24 22:05:11 | 显示全部楼层
哈哈,长见识了
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2012-8-23
在线时间
0 小时
 楼主| 发表于 2012-8-25 08:16:26 | 显示全部楼层
回复【9楼】若如初见:
---------------------------------
嗯,谢谢提醒,前面的基础先打好了后面学起来才顺利。
回复 支持 反对

使用道具 举报

17

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-17
在线时间
62 小时
发表于 2013-6-1 20:37:54 | 显示全部楼层
终于知道#ifndef __XXX_H是干什么用的了!谢谢
回复 支持 反对

使用道具 举报

38

主题

165

帖子

0

精华

高级会员

Rank: 4

积分
646
金钱
646
注册时间
2014-3-5
在线时间
67 小时
发表于 2014-5-11 21:33:03 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我可以多建立一些.h文件啊,我现在理解的.C不过是放了一些函数,然后调用而已!

如果放在.h中一样可以调用啊!
Hard work!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-11 22:19:17 | 显示全部楼层
回复【13楼】杂牌电子:
---------------------------------
你可以试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2014-7-25
在线时间
0 小时
发表于 2014-8-14 13:10:00 | 显示全部楼层
回复【12楼】czz88:
---------------------------------
这个定义是干什么用的,我还不是很清楚,求教
回复 支持 反对

使用道具 举报

17

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-17
在线时间
62 小时
发表于 2014-8-14 14:37:23 | 显示全部楼层
回复【15楼】liu781827051:
---------------------------------
防止重复定义啊,#ifndef __XXX_H就是如果没有#define 过__XXX_H就#define __XXX_H和接下去的那些语句,如果已经定义过__XXX_H就直接跳过了
回复 支持 反对

使用道具 举报

2

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2014-8-31
在线时间
33 小时
发表于 2014-10-5 20:39:01 | 显示全部楼层
今天我也是搞懂了为什么要这样做了,真的很感谢!
回复 支持 反对

使用道具 举报

12

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2015-7-29
在线时间
33 小时
发表于 2015-7-29 17:55:14 | 显示全部楼层
#ifndef与#endif 之间的程序只能执行一次
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-7-2
在线时间
16 小时
发表于 2016-1-2 11:26:54 | 显示全部楼层
大家都搞懂了,我感觉还有些模模糊糊,是不是这样的,#ifndef为了让这些头文件只执行一次,节省资源。
如果没有#ifndef,首先可能 出现重复引入头文件的情况,其次编译会很慢,占用资源大。
各位大神指点指点我哪理解的有问题
回复 支持 反对

使用道具 举报

16

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2016-8-13
在线时间
19 小时
发表于 2016-8-18 19:12:46 | 显示全部楼层
节省时间吗?
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-8-6
在线时间
11 小时
发表于 2017-3-4 12:49:30 | 显示全部楼层
看了20#的,有点眉目了。很厉害
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-5-25
在线时间
2 小时
发表于 2017-6-14 09:38:23 | 显示全部楼层
受教了,多谢!
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-7-5
在线时间
4 小时
发表于 2017-7-7 11:23:48 | 显示全部楼层
20#好厉害,我懂了 多谢
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-8-16
在线时间
18 小时
发表于 2017-8-16 17:01:16 来自手机 | 显示全部楼层
看了20#的说法理解了,感谢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-6-16
在线时间
2 小时
发表于 2018-7-21 19:32:05 | 显示全部楼层
感谢20楼
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2018-10-24
在线时间
2 小时
发表于 2018-12-12 10:07:57 | 显示全部楼层
为什么看不到回复
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-8-4
在线时间
4 小时
发表于 2019-8-4 10:19:58 | 显示全部楼层
各位大佬好,本人32单片机小白。
预编译的功能,本人已经知悉,本人之前学习过一些zigbee的知识,也是预编译。
我的问题是,预编译的形式,为什么是 #ifndef  _led_h   而不直接 #ifndef    led.h 呢?这里的下划线是什么意思呢?
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-1
在线时间
3 小时
发表于 2019-8-13 17:12:05 | 显示全部楼层
马帅帅 发表于 2019-8-4 10:19
各位大佬好,本人32单片机小白。
预编译的功能,本人已经知悉,本人之前学习过一些zigbee的知识,也是预 ...

就是 下滑线是标识符中一部分(标识符怎么写都可以我记得好像是字母下划线开头)
就像编译时没碰到这个标识符就执行了
define __LED_H

void LED_Init(void);就定义了函数。
碰到了这个标识符就不用再定义了。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2019-8-29
在线时间
6 小时
发表于 2019-9-12 22:10:56 | 显示全部楼层
__HEAD_H 仅仅是一个标识,只要符合C语言标识命名规则,可以写任意命名,为了易读性,一般都会与头文件名一致。
其中的前两个下划线没有任何语法上的意义,有些资料说是系统自带的头文件会使用两个下划线__,用户自己编写的头文件可以不用双下划线__,以表示与系统头文件的区别。
最后一个下划线表示头文件“HEAD.H”中的点,在C的语法中,“.”不能作为标识中的字符,所以用“_”标识“.”。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-9-11
在线时间
4 小时
发表于 2019-9-18 10:03:31 | 显示全部楼层
zjxuchu 发表于 2012-8-24 19:03
回复【4楼】正点原子:
---------------------------------
可行的&nbsp;我试过了。

你可以把所有代码全写在main.c里,更牛
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 00:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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