OpenEdv-开源电子网

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

关于system文件夹下3个.c文件的头文件包含问题

[复制链接]

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2013-8-3
在线时间
2 小时
发表于 2014-9-19 09:57:02 | 显示全部楼层 |阅读模式
5金钱
最近回过头来看软件发现头文件包含关系有点看不懂,因为C语言都是后来学的,基础不扎实,问题有点小白,请大神们多多包涵!谢谢

先说下我在网上看的资料,头文件的作用就是申明一些结构体啊宏啊 这类的定义,当.c文件需要使用到的时候只要加入include“xxx.h”就能够使用.h里定义的东西

然后说下我的疑问,麻烦高手帮忙解释下:

就以system文件夹下的三个文件为例,delay.c包含了delay.h和sys.h,而delay.h也包含了sys.h

delay.h里面是3个.c文件里包装好的3个函数,那么delay.c包含delay.h是不是为了能够在其他文件中使用delay的几个函数呢

第二个问题,在delay.h文件中使用了SysTick_CLKSourceConfig()函数,这是定义在misc.c里面的 应该在misc。h里也有,但是delay。c里没有包含misc.h,但是编译过程并没有出错。

后来我想了下,可能是因为sys.h里包含了stm32f10x.h。因为delay.c并未使用任何sys.h的东西,delay.c包含sys.h就是为了包含stm32f10x.h。就像函数调用,调用的函数里又调用了另外一个函数,这样理解是否正确呢

第三个问题 为什么我在delay.c里已经包含了sys.h为什么在delay.h里还要再包含sys.h呢,在我理解看来delay.c包含delay.h是为了别的程序能使用delay函数,在delay.h里包含sys.h是为了包含sys.h里的stm32f10x.h,如果理解正确的话 那为什么delay.c里面也要包含sys.h呢

理下关系,delay.c包含delay.h   delay.h包含 sys.h  sys.h包含stm32f10x.h。所以delay.c能用stm32f10x.h里的东西。那delay.c就不用包含sys.h了呀

可能说的有点乱,但是以前看的时候没注意,现在回过头看就有点难理解,麻烦高手解释下,先谢谢了 

最佳答案

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

你的第一个问题你理解的是正确的, 头文件主要就是用来为了减少代码的重复编写,把公用的代码放在一个文件中; 第二个问题SysTick_CLKSourceConfig()函数声明在misc.h 中,在其他的地方肯定包含了misc.h这个头文件,或者你可以直接在delay.h中写#include “misc.h”,没必要考虑那么多; 第三个问题一般规范的头文件都包含了防止被重复包含的语句,就是开头的语句。就拿stm32f10x.h头文件来说, 开头部分 #ifndef ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2014-1-22
在线时间
43 小时
发表于 2014-9-19 09:57:03 | 显示全部楼层
你的第一个问题你理解的是正确的, 头文件主要就是用来为了减少代码的重复编写,把公用的代码放在一个文件中;
第二个问题SysTick_CLKSourceConfig()函数声明在misc.h 中,在其他的地方肯定包含了misc.h这个头文件,或者你可以直接在delay.h中写#include “misc.h”,没必要考虑那么多;
第三个问题一般规范的头文件都包含了防止被重复包含的语句,就是开头的语句。就拿stm32f10x.h头文件来说,
开头部分
#ifndef __STM32F10x_H
#define __STM32F10x_H



#endif
如果没有 定义__STM32F10x_H这个宏,#ifndef __STM32F10x_H语句就是真,执行下面的语句一直到#endif,如果define过__STM32F10x_H,那麽判断为假,就跳过了这部分,所以一般重复#include 了多个头文件也不会出问题(具体的你可以查查头文件定义格式的资料);
有一个小方法就是你用到了 那个函数你可以直接把它所在的头问价包含,而不必要考虑其他的东西(就比如你的那个SysTick_CLKSourceConfig()函数,直接包含misc.h 就行了,而不用考虑谁包含了谁,谁里面又有谁,把自己都绕进去了。)
任何一件事情,只要心甘情愿,总是能够变得简单。
回复

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2013-8-3
在线时间
2 小时
 楼主| 发表于 2014-9-19 12:54:54 | 显示全部楼层
回复【2楼】爱不孤单:
---------------------------------
谢谢 在你帮助下 把所有的定义都删掉自己重新弄了下,现在清爽多了。顺便给大家分享下刚才整理时发现的小技巧,可能有的人已经知道了,

就是头文件的包含也是有顺序的,就举刚才的例子,

就delay而言,delay.c里用到SysTick_CLKSourceConfig(),u32 和u16的定义,变量重命名u8和u16在stm32f10x.h里,函数定义在misc.h里,而stm32f10x.h里包含了conf.h,conf.h里就有misc.h,这样我直接在delay.c里加上stm32f10x.h就可以了
然后再加上include“delay.h“就好了。

我是这样写的

#include”delay.h“
#include"stm32f10x.h"

然后编译发现 错误delay.h里面的U32和U16未定义

下面的是delay.h里的定义
void delay_ms(u16 nms);
void delay_us(u32 nus);

然后我就知道了编译包含头文件时肯定是有顺序的,因为我delay.h是写在前面的,但是delay.h里的U32和U16是在stm32f10x.h里定义的
编译器先看delay.h的时候就会发现U16和U32未定义,自然报错
要把STM32F10X.H写在前面,编译器先看过STM32F10X.H再去看delay.h就知道U32和U16在STM32F10X.H里定义过了就不会报错

总之,谢谢爱不简单的帮助!
回复

使用道具 举报

12

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2014-1-22
在线时间
43 小时
发表于 2014-9-19 13:35:41 | 显示全部楼层
恩恩,懂了自然是极好,我习惯了用到什么就包含什么,比如U32和U16未定义,我会直接把stm32f10x.h放在delay.h 里面,不知道你发现了没,自己定义的.h 文件 都会添加stm32f10x.h,这个头文件包含了外设结构体定义和地址映射等,(*^__^*) 嘻嘻

另外 俺的名是爱不孤单啊。。
任何一件事情,只要心甘情愿,总是能够变得简单。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 01:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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