OpenEdv-开源电子网

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

?为什么需要宏定义?

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-7-30
在线时间
3 小时
发表于 2015-7-30 19:31:57 | 显示全部楼层 |阅读模式
5金钱
#ifndef __LED_H
#define __LED_H  

为什么需要宏定义?

最佳答案

查看完整内容[请看2#楼]

请自行百度找答案。 然后来这里告诉大家,为什么。 百度关键字:头文件  #ifndef
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-30 19:31:58 | 显示全部楼层
请自行百度找答案。
然后来这里告诉大家,为什么。
百度关键字:头文件  #ifndef
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-7-30
在线时间
3 小时
 楼主| 发表于 2015-7-30 19:31:58 | 显示全部楼层
知道是为了避免重复定义,但是却不知道避免重复什么,被困扰了很久,只是一直不知道怎么解释,谢谢大家

在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时
,就会出现大量“重定义”的错误。在头文件中实用#ifndef #define #endif能避免头文件的重定义。
方法:例如要编写头文件test.h
在头文件开头写上两行:
#ifndef _TEST_H
#define _TEST_H//一般是文件名的大写
头文件结尾写上一行:
#endif
这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。
分析:当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和
#endif之间的代码,当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和
#endif之间的代码也就不会再次被包含,这样就避免了重定义了。
#ifndef __74HC595_H__
#define __74HC595_H__


#endif
#ifndef _optimizedvector_h // if not define _optimizedvector_h
#define _optimizedvector_h // then define _optimizedvector_h
通俗点就是如果没定义_optimizedvector_h,那就定义_optimizedvector_h,防止重复编译
头文件中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编
译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。
还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般
格式是这样的:

#ifndef <标识>
#define <标识>
......
#endif

<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头
文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,
如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-7-30 22:34:33 | 显示全部楼层
_LED_H这个宏可以作为该头文件的标识,上述宏定义的含义就是:如果还没有定义这个标识,那就定义一下这个标识,如果已经定义了这个标识,那这个ifndef后面直到对应的endif之间的代码都是不处理的。而这样做的目的是为了同一个头文件不会被重复包含:当第一次引用该头文件时,这个标识是没有被定义的,所以后面的内容才会被处理,并且定义这个标识,当第二次引用该头文件的时候,编译器会发现已经定义了这个标识,后面的内容就不会再去重复处理了。
不知道楼主有没有百度到答案,希望分享一下
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2015-7-31 00:18:00 | 显示全部楼层
度娘是你最好的选择。。。。
回复

使用道具 举报

1

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-7-16
在线时间
3 小时
发表于 2015-7-31 09:27:23 | 显示全部楼层
回复【4楼】FantaSy_:
---------------------------------
度娘太弱,Google才是大神
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 06:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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