说说头文件
您好 ,小白来报道 ,请大侠们多多指导 ~1. 头文件里面 要不要写函数体啊
2. 如果头文件里,没有写函数体 只写了个函数名。在主函数里面仅 【 # include 改头文件 】, 编译时怎么找到子函数体啊
谢谢
.c文件里面写函数
void 函数名(void)
{
}
.h文件里面写申明
最后调用这个.h头文件就可以找到函数了 嗯嗯 , 谢谢您,
调用这个.h头文件,然后自动定位到.c文件 ,然后去里面找 .h头文件里面所声明 的函数对吗?
sunshine51 发表于 2023-3-22 11:56
嗯嗯 , 谢谢您,
调用这个.h头文件,然后自动定位到.c文件 ,然后去里面找 .h头文件里面所声明 的函数对吗 ...
:lol对的呢 电子DIY小家 发表于 2023-3-22 13:29
对的呢
:hug::hug:谢谢啊
电子DIY小家 发表于 2023-3-22 11:42
.c文件里面写函数
void 函数名(void)
{
你好 前辈,
我还是有点不清楚, 如果.h头文件里不写函数体, 又怎么知道它声明的子函数到底在哪个.c的文件里。
如果一个工程里包含了很多个名称千其百怪.c的文件, 那么.h头文件声明的函数 是在哪个.c的文件里面呢。
此外,例如 A.c, B.c,X.c 的文件(都在同一个工程树下)都包含了.h头文件声明的子函数 f(x), 那用哪个.c文件呢? 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文件里申明的函数都能随意调用
电子DIY小家 发表于 2023-3-22 14:16
例如key.c
key.h
函数定义的名称有且只有一个,整个工程只会有一个KEY_Deal和KEY_ReadState函数..
嗯嗯 ,
自己打个比喻: 头文件好像就是张名片(张三)。
1.编译器根据这张名片在整个工程里面找张三这个人。
2.张三这个人在工程里面有且唯一(不会有重名) , 就一定能找到张三。
前辈帮看看理解对不?
头文件不要写任何程序,只是定义一些宏,定义IO或特殊功能寄存器,声明外部函数、声明外部变量等等。 梁工 发表于 2023-3-22 14:52
头文件不要写任何程序,只是定义一些宏,定义IO或特殊功能寄存器,声明外部函数、声明外部变量等等。 ...
恩恩额 , 好的 ~