找回密码
 立即注册
查看: 3546|回复: 26

说说头文件

[复制链接]

1

主题

14

回帖

43

积分

新手上路

积分
43
发表于 2023-3-22 10:59:14 | 显示全部楼层 |阅读模式
您好 ,小白来报道 ,请大侠们多多指导 ~
1. 头文件里面 要不要写函数体啊
2. 如果头文件里,没有写函数体 只写了个函数名。在主函数里面仅 【 # include 改头文件 】, 编译时怎么找到子函数体啊
谢谢
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-3-22 11:42:59 | 显示全部楼层
.c文件里面写函数
void 函数名(void)
{

}

.h文件里面写申明

最后调用这个.h头文件就可以找到函数了

1

主题

14

回帖

43

积分

新手上路

积分
43
发表于 2023-3-22 11:56:31 | 显示全部楼层
嗯嗯 , 谢谢您,
调用这个.h头文件,然后自动定位到.c文件 ,然后去里面找 .h头文件里面所声明 的函数对吗?
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-3-22 13:29:22 | 显示全部楼层
sunsh*** 发表于 2023-3-22 11:56
嗯嗯 , 谢谢您,
调用这个.h头文件,然后自动定位到.c文件 ,然后去里面找 .h头文件里面所声明 的函数对吗 ...

:lol对的呢

1

主题

14

回帖

43

积分

新手上路

积分
43
发表于 2023-3-22 13:34:45 | 显示全部楼层

:hug::hug:谢谢啊

1

主题

14

回帖

43

积分

新手上路

积分
43
发表于 2023-3-22 13:52:40 | 显示全部楼层
电子DI*** 发表于 2023-3-22 11:42
.c文件里面写函数
void 函数名(void)
{

你好 前辈,
我还是有点不清楚, 如果.h头文件里不写函数体, 又怎么知道它声明的子函数到底在哪个.c的文件里。
如果一个工程里包含了很多个名称千其百怪.c的文件, 那么.h头文件声明的函数 是在哪个.c的文件里面呢。
此外,例如 A.c, B.c,X.c 的文件(都在同一个工程树下)都包含了.h头文件声明的子函数 f(x), 那用哪个.c文件呢?
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-3-22 14:16:30 | 显示全部楼层
sunsh*** 发表于 2023-3-22 13:52
你好 前辈,
我还是有点不清楚, 如果.h头文件里不写函数体, 又怎么知道它声明的子函数到底在哪个.c的 ...

例如key.c

  1. #include "key.h"
  2. u16 Count[8] = {0,0,0,0,0,0,0,0};
  3. u8  LastState = 0;                                                //8位变量         b0=1,代表k0上一次按下过
  4. //========================================================================
  5. // 函数名称: KEY_Deal
  6. // 函数功能: 按键状态读取
  7. // 入口参数: 无
  8. // 函数返回: 无
  9. // 当前版本: VER1.0
  10. // 修改日期: 2023 - 1-1
  11. // 当前作者:
  12. // 其他备注:循环读取八个端口的状态,并将按下的时间赋值给 Count 数组,按下的状态赋值给LastState
  13. //========================================================================
  14. void KEY_Deal(void)                        //检查所有的按键状态 10ms执行一次
  15. {
  16.         u8 i = 0;
  17.         for(i=0;i<8;i++)                                        //循环8次 i的取值范围是0-7  代表了P30-P37的状态查询
  18.         {
  19.                 if( ~KEY & ( 1<<i ) )                        //持续按下,变量+1  
  20.                 {
  21.                         if( Count[i]<60000 )
  22.                                 Count[i] ++;                        //按键按下,这个计数变量+1
  23.                 }
  24.                 else                                                        //按键松开了,变量清0
  25.                 {
  26.                         if( Count[i]>0 )                        //如果这个变量是按下过的
  27.                         {
  28.                                 LastState |= (1<<i);        //这个变量相应的标志位置位
  29.                         }
  30.                         else
  31.                         {
  32.                                 LastState &= ~(1<<i);        //这个变量相应的标志位清0
  33.                         }
  34.                         Count[i] = 0;                                //按键按下,这个计数变量清0
  35.                 }
  36.         }
  37. }
  38. //========================================================================
  39. // 函数名称: KEY_ReadState
  40. // 函数功能: 读取指定的按钮的状态
  41. // 入口参数: @keynum : 按钮的端口号 例如P32端口,端口号就是2
  42. // 函数返回: 看其他备注
  43. // 当前版本: VER1.0
  44. // 修改日期: 2023 - 1- 1
  45. // 当前作者:
  46. // 其他备注: 函数返回值如下
  47. //        #define        KEY_NOPRESS                0                //按键未按下
  48. //        #define        KEY_FILCKER                1                //消抖
  49. //        #define        KEY_PRESS                2                //单击
  50. //        #define        KEY_PRESSOVER        3                //单击结束
  51. //        #define        KEY_LONGPRESS        4                //长按3秒
  52. //        #define        KEY_LONGOVER        5                //长按结束
  53. //        #define        KEY_RELAX                6                //按键松开
  54. //========================================================================
  55. u8 KEY_ReadState(u8 keynum)        //读取指定的按键的状态 10ms执行一次
  56. {
  57.         if( Count[keynum]>0 )                                        //按键是按下的各种状态返回
  58.         {
  59.                 if( Count[keynum]<3 )                                //按下<30ms 返回消抖状态
  60.                 {
  61.                         return KEY_FILCKER;
  62.                 }
  63.                 else if( Count[keynum]==3 )                        //按下正好30ms 返回单击
  64.                 {
  65.                         return KEY_PRESS;
  66.                 }
  67.                 else if( Count[keynum]<300 )                //按下不到3000ms 返回单击结束
  68.                 {
  69.                         return KEY_PRESSOVER;
  70.                 }               
  71.                 else if( Count[keynum]==300 )                //按下正好3000ms 返回长按状态
  72.                 {
  73.                         return KEY_LONGPRESS;
  74.                 }
  75.                 else                                                                //长按结束
  76.                 {
  77.                         return KEY_LONGOVER;
  78.                 }                       
  79.                
  80.         }
  81.         else                                                                        //按键已经松开了,返回各种状态
  82.         {
  83.                 if( LastState &( 1<<keynum ) )                //按键之前按下过
  84.                 {
  85.                         return KEY_RELAX;               
  86.                 }
  87.                 else                                                                //按键之前没有按下
  88.                 {
  89.                         return KEY_NOPRESS;
  90.                 }
  91.         }
  92. }
复制代码
key.h
  1. #ifndef __KEY_H
  2. #define __KEY_H
  3. #include "COMM/stc.h"                //调用头文件
  4. #include "COMM/usb.h"
  5. //------------------------------引脚定义------------------------------
  6. #define KEY         P3                                //P32-P35
  7. #define KEY1        2                                //按键1
  8. #define KEY2        3                                //按键2
  9. #define KEY3        4                                //按键3
  10. #define KEY4        5                                //按键4
  11. //------------------------------变量声明------------------------------
  12. #define        KEY_NOPRESS                0                //按键未按下
  13. #define        KEY_FILCKER                1                //消抖
  14. #define        KEY_PRESS                2                //单击
  15. #define        KEY_PRESSOVER        3                //单击结束
  16. #define        KEY_LONGPRESS        4                //长按3秒
  17. #define        KEY_LONGOVER        5                //长按结束
  18. #define        KEY_RELAX                6                //按键松开
  19. //------------------------------函数声明------------------------------
  20. void KEY_Deal(void);                        //检查所有的按键状态
  21. u8 KEY_ReadState(u8 keynum);        //读取指定的按键的状态
  22. #endif
复制代码



如上key.c就是函数的定义,key.h就是函数的声明,另外的不管什么文件只要调用了key.h就可以使用这里申明的KEY_Deal和KEY_ReadState函数,因为函数定义的名称有且只有一个,整个工程只会有一个KEY_Deal和KEY_ReadState函数,只要文件的路径选对,引用的头文件选对,任意的.h文件里申明的函数都能随意调用

1

主题

14

回帖

43

积分

新手上路

积分
43
发表于 2023-3-22 14:35:34 | 显示全部楼层

函数定义的名称有且只有一个,整个工程只会有一个KEY_Deal和KEY_ReadState函数..
嗯嗯 ,
自己打个比喻: 头文件好像就是张名片(张三)。
1.编译器根据这张名片  在整个工程里面找张三这个人。
2.张三这个人在工程里面有且唯一(不会有重名) , 就一定能找到张三。
前辈帮看看理解对不?
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2023-3-22 14:52:36 | 显示全部楼层
头文件不要写任何程序,只是定义一些宏,定义IO或特殊功能寄存器,声明外部函数、声明外部变量等等。

1

主题

14

回帖

43

积分

新手上路

积分
43
发表于 2023-3-22 14:55:38 | 显示全部楼层
梁*** 发表于 2023-3-22 14:52
头文件不要写任何程序,只是定义一些宏,定义IO或特殊功能寄存器,声明外部函数、声明外部变量等等。 ...

恩恩额 , 好的 ~

点评

另外要注意,头文件一般都要有防重复包含的语句,看下面的例子: #ifndef __STC8H_H #define __STC8H_H //你的定义 #endif  详情 回复 发表于 2023-3-22 15:07
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:29 , Processed in 0.150107 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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