[STM32F4] 关于头文件里面的宏定义的疑惑

[复制链接]
6895|21
 楼主| 摩天轮1111 发表于 2015-6-14 22:35 | 显示全部楼层 |阅读模式
AC, RS, se, TE, Users
file:///C:\Users\hp\AppData\Roaming\Tencent\Users\792286050\QQ\WinTemp\RichOle\1QNQBII(JHG15TX_8`1GJ30.png QQ图片20150614222902.png QQ图片20150614222908.png QQ图片20150614222913.png QQ图片20150614222919.png
说下本人疑惑,就是如图,这里我是key.h的头文件,为什么里面宏定义这里用的是__KEY_H,这样的,而不是key.h,而且我试了beep那里要是写成beep.h是会报错的,
我看c语言里面是区分大小写的,为什么宏定义中一般用大写呢,而且这个大小和我小写的头文件名字形式也不一样啊,这个当中有没有什么具体的缘由,希望大神能给耐心讲解一下,十分感谢,
还有那个beep的那个头文件里面的开头的宏定义部分,我写了小写的__Beep_H,__BEEP_H,__beep_h,__Beep_h,这样的话有没有什么区别呢?会带来什么问题吗?希望大神能给讲解一下,十分感谢

19910414twzh 发表于 2015-6-14 22:56 | 显示全部楼层
是一种规范,直接上F4牛掰
 楼主| 摩天轮1111 发表于 2015-6-14 23:07 | 显示全部楼层
19910414twzh 发表于 2015-6-14 22:56
是一种规范,直接上F4牛掰

就按我下面假设的那几种写法呢,会有什么问题吗 , 我不是很明白这个问题,我试了编译没有问题,只要写.h这样的形式编译就会有问题的
19910414twzh 发表于 2015-6-14 23:42 | 显示全部楼层
.h。。是头文件的后缀。。。而且C里变量名(下划线、字母、数字)
airwill 发表于 2015-6-15 06:34 | 显示全部楼层
为什么里面宏定义这里用的是__KEY_H,这样的,而不是key.h,  本来C并不限制你怎么定义, 但因为 .包括+-/* 等很多符合都不能用在名称定义里

我看c语言里面是区分大小写的,为什么宏定义中一般用大写呢, 同样是 C 并不限制你, 只是大家都这么写了, 也就成了不强制性规则(为了便于交流理解)

还有那个beep的那个头文件里面的开头的宏定义部分,我写了小写的__Beep_H,__BEEP_H,__beep_h,__Beep_h,这样的话有没有什么区别呢?会带来什么问题吗?          只有不和其他头文件里出现重名的定义就没有问题, 说穿了, 这个定义就是为了避免 include 相互交叉引起重复包含而重复定义而使用的.
wowow 发表于 2015-6-15 07:43 | 显示全部楼层
举例:
a.h 定义了某个类型。
b.h include a.h
b.c include a.h, b.h
如果没有那套#ifndef东西,b.c编译就会报某个类型重复定义的错。
也就是那个宏只是个标签,标记#ifndef....#endif之间的内容是否已经编译过一次了。因此任意不重复的宏名都可以,一般用跟文件名相关的字符串
C编译器没有那么智能,自动识别哪些头文件已经解析过了。有些C++编译器,如VC使用了个#program once的定义,告诉编译器这个头文件只编译一次。它将编译过的内容放到一个数据库里,下次再碰到这个头文件,直接到库里查,可以加快编译速度。
戈卫东 发表于 2015-6-15 07:59 | 显示全部楼层
很显然那个beep.c有点奇怪
一般#ifndef 和后面那个#define 会用相同的符号
 楼主| 摩天轮1111 发表于 2015-6-15 09:10 | 显示全部楼层
戈卫东 发表于 2015-6-15 07:59
很显然那个beep.c有点奇怪
一般#ifndef 和后面那个#define 会用相同的符号

是的,那个是我乱改的,看看,编译有没有错,编译也没有错,
 楼主| 摩天轮1111 发表于 2015-6-15 09:11 | 显示全部楼层
airwill 发表于 2015-6-15 06:34
为什么里面宏定义这里用的是__KEY_H,这样的,而不是key.h,  本来C并不限制你怎么定义, 但因为 .包括+-/*  ...

谢谢您的回复,这个“为了避免 include 相互交叉引起重复包含而重复定义而使用的”能说的具体点举个例子吗,我小菜鸟,不是很明白这里面的问题,,,
 楼主| 摩天轮1111 发表于 2015-6-15 09:15 | 显示全部楼层
wowow 发表于 2015-6-15 07:43
举例:
a.h 定义了某个类型。
b.h include a.h

您好,谢谢您举得例子,但是可能您讲的有点快,您的意思是在b.h里面有句话#include“a.h”,然后b.c里面也有句话,#include“a.h”, #include“b.h”,是这样的吗,然后编译b.c的时候就会报错,原因是因为#include“b.h”时候重新编译了一次“a.h”?那#ifndef这句话怎么把这个问题解决的呢?能详细一点吗,谢谢您,我不是很明白,还是在疑惑中,,谢谢您
 楼主| 摩天轮1111 发表于 2015-6-15 09:24 | 显示全部楼层
airwill 发表于 2015-6-15 06:34
为什么里面宏定义这里用的是__KEY_H,这样的,而不是key.h,  本来C并不限制你怎么定义, 但因为 .包括+-/*  ...

刚刚又再看了一下所有的头文件,发现,比如说beep.h,这个文件,别的文件包含它的时候写的是#include“beep.h”,而在beep.c里面写的是define __BEEP_H,发现所有的头文件都是这么样的操作,比如key.h也是这样的,确实是所有的“某.h”文件里面的define“__某_H”是都是不一样的,是不是可以理解为,这个beep.h里面的这个__BEEP_H是和beep.h唯一对应的?但是我就是想的是这里定义了__BEEP_H,但是在其他的文件的include中也不会包含__BEEP_H的啊,其他的.h文件里面包含的是#include“beep.h”,那__BEEP_H在这里充当了一个什么样的角色呢?,先谢谢版主您,我很菜鸟,问题比较多,可能比较低级,望不吝赐教,谢谢您
 楼主| 摩天轮1111 发表于 2015-6-15 09:33 | 显示全部楼层
捕获.JPG
差不多明白这个意思了,刚刚百度也查了一下,顺着两位大神的思路百度找了下,明白了这个细节操作是怎么实现的了,谢谢两位大神
clnbcl 发表于 2015-6-15 11:22 | 显示全部楼层
宏定义一般是用大写字母定义的。
JFIA 发表于 2015-6-15 11:30 | 显示全部楼层
_GetENDPOINT(bEpNum)        ((u16)(*(EP0REG + bEpNum
JFIA 发表于 2015-6-15 11:32 | 显示全部楼层
_G#define ENDP0   ((u8)0)
#define ENDP1   ((u8)1)
#define ENDP2   ((u8)2)
#define ENDP3   ((u8)3)
#define ENDP4   ((u8)4)
#define ENDP5   ((u8)5)
#define ENDP6   ((u8)6)
#define ENDP7   ((u8)7)etENDPOINT(bEpNum)        ((u16)(*(EP0REG + bEpNum
JFIA 发表于 2015-6-15 11:32 | 显示全部楼层
请问是否定义错误
lgq1542380129 发表于 2015-6-15 15:40 | 显示全部楼层
大小写好像都可以的。
sanxinweiled 发表于 2015-6-15 16:13 | 显示全部楼层
不懂  顶起来
qinjinghua2012 发表于 2015-6-15 18:12 | 显示全部楼层
学习了。
fanxsd 发表于 2015-6-15 21:14 | 显示全部楼层
你不这样 调用 。h文件 不就在那 重复定义吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

224

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部