sunshine51 发表于 2023-3-22 10:59:14

说说头文件

您好 ,小白来报道 ,请大侠们多多指导 ~
1. 头文件里面 要不要写函数体啊
2. 如果头文件里,没有写函数体 只写了个函数名。在主函数里面仅 【 # include 改头文件 】, 编译时怎么找到子函数体啊
谢谢

电子DIY小家 发表于 2023-3-22 11:42:59

.c文件里面写函数
void 函数名(void)
{

}

.h文件里面写申明

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

sunshine51 发表于 2023-3-22 11:56:31

嗯嗯 , 谢谢您,
调用这个.h头文件,然后自动定位到.c文件 ,然后去里面找 .h头文件里面所声明 的函数对吗?

电子DIY小家 发表于 2023-3-22 13:29:22

sunshine51 发表于 2023-3-22 11:56
嗯嗯 , 谢谢您,
调用这个.h头文件,然后自动定位到.c文件 ,然后去里面找 .h头文件里面所声明 的函数对吗 ...

:lol对的呢

sunshine51 发表于 2023-3-22 13:34:45

电子DIY小家 发表于 2023-3-22 13:29
对的呢

:hug::hug:谢谢啊

sunshine51 发表于 2023-3-22 13:52:40

电子DIY小家 发表于 2023-3-22 11:42
.c文件里面写函数
void 函数名(void)
{


你好 前辈,
我还是有点不清楚, 如果.h头文件里不写函数体, 又怎么知道它声明的子函数到底在哪个.c的文件里。
如果一个工程里包含了很多个名称千其百怪.c的文件, 那么.h头文件声明的函数 是在哪个.c的文件里面呢。
此外,例如 A.c, B.c,X.c 的文件(都在同一个工程树下)都包含了.h头文件声明的子函数 f(x), 那用哪个.c文件呢?

电子DIY小家 发表于 2023-3-22 14:16:30

sunshine51 发表于 2023-3-22 13:52
你好 前辈,
我还是有点不清楚, 如果.h头文件里不写函数体, 又怎么知道它声明的子函数到底在哪个.c的 ...

例如key.c

#include "key.h"

u16 Count = {0,0,0,0,0,0,0,0};
u8LastState = 0;                                                //8位变量         b0=1,代表k0上一次按下过

//========================================================================
// 函数名称: KEY_Deal
// 函数功能: 按键状态读取
// 入口参数: 无
// 函数返回: 无
// 当前版本: VER1.0
// 修改日期: 2023 - 1-1
// 当前作者:
// 其他备注:循环读取八个端口的状态,并将按下的时间赋值给 Count 数组,按下的状态赋值给LastState
//========================================================================
void KEY_Deal(void)                        //检查所有的按键状态 10ms执行一次
{
        u8 i = 0;
        for(i=0;i<8;i++)                                        //循环8次 i的取值范围是0-7代表了P30-P37的状态查询
        {
                if( ~KEY & ( 1<<i ) )                        //持续按下,变量+1
                {
                        if( Count<60000 )
                                Count ++;                        //按键按下,这个计数变量+1
                }
                else                                                        //按键松开了,变量清0
                {
                        if( Count>0 )                        //如果这个变量是按下过的
                        {
                                LastState |= (1<<i);        //这个变量相应的标志位置位
                        }
                        else
                        {
                                LastState &= ~(1<<i);        //这个变量相应的标志位清0
                        }
                        Count = 0;                                //按键按下,这个计数变量清0
                }
        }
}

//========================================================================
// 函数名称: KEY_ReadState
// 函数功能: 读取指定的按钮的状态
// 入口参数: @keynum : 按钮的端口号 例如P32端口,端口号就是2
// 函数返回: 看其他备注
// 当前版本: VER1.0
// 修改日期: 2023 - 1- 1
// 当前作者:
// 其他备注: 函数返回值如下
//        #define        KEY_NOPRESS                0                //按键未按下
//        #define        KEY_FILCKER                1                //消抖
//        #define        KEY_PRESS                2                //单击
//        #define        KEY_PRESSOVER        3                //单击结束
//        #define        KEY_LONGPRESS        4                //长按3秒
//        #define        KEY_LONGOVER        5                //长按结束
//        #define        KEY_RELAX                6                //按键松开
//========================================================================

u8 KEY_ReadState(u8 keynum)        //读取指定的按键的状态 10ms执行一次
{
        if( Count>0 )                                        //按键是按下的各种状态返回
        {
                if( Count<3 )                                //按下<30ms 返回消抖状态
                {
                        return KEY_FILCKER;
                }
                else if( Count==3 )                        //按下正好30ms 返回单击
                {
                        return KEY_PRESS;
                }
                else if( Count<300 )                //按下不到3000ms 返回单击结束
                {
                        return KEY_PRESSOVER;
                }               
                else if( Count==300 )                //按下正好3000ms 返回长按状态
                {
                        return KEY_LONGPRESS;
                }
                else                                                                //长按结束
                {
                        return KEY_LONGOVER;
                }                       
               
        }
        else                                                                        //按键已经松开了,返回各种状态
        {
                if( LastState &( 1<<keynum ) )                //按键之前按下过
                {
                        return KEY_RELAX;               
                }
                else                                                                //按键之前没有按下
                {
                        return KEY_NOPRESS;
                }
        }
}


key.h
#ifndef __KEY_H
#define __KEY_H

#include "COMM/stc.h"                //调用头文件
#include "COMM/usb.h"

//------------------------------引脚定义------------------------------
#define KEY         P3                                //P32-P35

#define KEY1        2                                //按键1
#define KEY2        3                                //按键2
#define KEY3        4                                //按键3
#define KEY4        5                                //按键4

//------------------------------变量声明------------------------------
#define        KEY_NOPRESS                0                //按键未按下
#define        KEY_FILCKER                1                //消抖
#define        KEY_PRESS                2                //单击
#define        KEY_PRESSOVER        3                //单击结束
#define        KEY_LONGPRESS        4                //长按3秒
#define        KEY_LONGOVER        5                //长按结束
#define        KEY_RELAX                6                //按键松开


//------------------------------函数声明------------------------------
void KEY_Deal(void);                        //检查所有的按键状态
u8 KEY_ReadState(u8 keynum);        //读取指定的按键的状态

#endif




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

sunshine51 发表于 2023-3-22 14:35:34

电子DIY小家 发表于 2023-3-22 14:16
例如key.c

key.h


函数定义的名称有且只有一个,整个工程只会有一个KEY_Deal和KEY_ReadState函数..
嗯嗯 ,
自己打个比喻: 头文件好像就是张名片(张三)。
1.编译器根据这张名片在整个工程里面找张三这个人。
2.张三这个人在工程里面有且唯一(不会有重名) , 就一定能找到张三。
前辈帮看看理解对不?

梁工 发表于 2023-3-22 14:52:36

头文件不要写任何程序,只是定义一些宏,定义IO或特殊功能寄存器,声明外部函数、声明外部变量等等。

sunshine51 发表于 2023-3-22 14:55:38

梁工 发表于 2023-3-22 14:52
头文件不要写任何程序,只是定义一些宏,定义IO或特殊功能寄存器,声明外部函数、声明外部变量等等。 ...

恩恩额 , 好的 ~
页: [1] 2 3
查看完整版本: 说说头文件