打印
[STM32F4]

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

[复制链接]
5928|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AC, RS, se, TE, Users
file:///C:\Users\hp\AppData\Roaming\Tencent\Users\792286050\QQ\WinTemp\RichOle\1QNQBII(JHG15TX_8`1GJ30.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里变量名(下划线、字母、数字)

使用特权

评论回复
5
airwill| | 2015-6-15 06:34 | 只看该作者
为什么里面宏定义这里用的是__KEY_H,这样的,而不是key.h,  本来C并不限制你怎么定义, 但因为 .包括+-/* 等很多符合都不能用在名称定义里

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

还有那个beep的那个头文件里面的开头的宏定义部分,我写了小写的__Beep_H,__BEEP_H,__beep_h,__Beep_h,这样的话有没有什么区别呢?会带来什么问题吗?          只有不和其他头文件里出现重名的定义就没有问题, 说穿了, 这个定义就是为了避免 include 相互交叉引起重复包含而重复定义而使用的.

使用特权

评论回复
6
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的定义,告诉编译器这个头文件只编译一次。它将编译过的内容放到一个数据库里,下次再碰到这个头文件,直接到库里查,可以加快编译速度。

使用特权

评论回复
7
戈卫东| | 2015-6-15 07:59 | 只看该作者
很显然那个beep.c有点奇怪
一般#ifndef 和后面那个#define 会用相同的符号

使用特权

评论回复
8
摩天轮1111|  楼主 | 2015-6-15 09:10 | 只看该作者
戈卫东 发表于 2015-6-15 07:59
很显然那个beep.c有点奇怪
一般#ifndef 和后面那个#define 会用相同的符号

是的,那个是我乱改的,看看,编译有没有错,编译也没有错,

使用特权

评论回复
9
摩天轮1111|  楼主 | 2015-6-15 09:11 | 只看该作者
airwill 发表于 2015-6-15 06:34
为什么里面宏定义这里用的是__KEY_H,这样的,而不是key.h,  本来C并不限制你怎么定义, 但因为 .包括+-/*  ...

谢谢您的回复,这个“为了避免 include 相互交叉引起重复包含而重复定义而使用的”能说的具体点举个例子吗,我小菜鸟,不是很明白这里面的问题,,,

使用特权

评论回复
10
摩天轮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这句话怎么把这个问题解决的呢?能详细一点吗,谢谢您,我不是很明白,还是在疑惑中,,谢谢您

使用特权

评论回复
11
摩天轮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在这里充当了一个什么样的角色呢?,先谢谢版主您,我很菜鸟,问题比较多,可能比较低级,望不吝赐教,谢谢您

使用特权

评论回复
12
摩天轮1111|  楼主 | 2015-6-15 09:33 | 只看该作者

差不多明白这个意思了,刚刚百度也查了一下,顺着两位大神的思路百度找了下,明白了这个细节操作是怎么实现的了,谢谢两位大神

使用特权

评论回复
13
clnbcl| | 2015-6-15 11:22 | 只看该作者
宏定义一般是用大写字母定义的。

使用特权

评论回复
14
JFIA| | 2015-6-15 11:30 | 只看该作者
_GetENDPOINT(bEpNum)        ((u16)(*(EP0REG + bEpNum

使用特权

评论回复
15
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

使用特权

评论回复
16
JFIA| | 2015-6-15 11:32 | 只看该作者
请问是否定义错误

使用特权

评论回复
17
lgq1542380129| | 2015-6-15 15:40 | 只看该作者
大小写好像都可以的。

使用特权

评论回复
18
sanxinweiled| | 2015-6-15 16:13 | 只看该作者
不懂  顶起来

使用特权

评论回复
19
qinjinghua2012| | 2015-6-15 18:12 | 只看该作者
学习了。

使用特权

评论回复
20
fanxsd| | 2015-6-15 21:14 | 只看该作者
你不这样 调用 。h文件 不就在那 重复定义吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

224

帖子

15

粉丝