有关头文件写法或者函数声明调用的小技巧分享
时间:10-02
整理:3721RD
点击:
能解决的问题:
1) 经常有初学者对.h文件和.c文件里面函数/变量的声明 、调用的方式无法理解或者无法很直接透彻的方式理解,本帖对此理解应该有所帮助;
2)很多写了2、3年C的单片机应用开发者对.h文件 、 .c文件的书写感觉规范性不够好,书写比较乱,本贴可以给出一种比较清晰、明了的书写格式;
3)函数声明、其他C文件调用另一个C文件的函数使用extern关键字比较频繁、编译器偶尔报错偶尔不报错,导致运行时代码无故死机、重启,有时跟函数声明、调用的有问题而编译器没有报错,本贴但愿能给出简单的建设性意见。
一般文件声明、定义、调用的格式如下:
应用场景介绍:a.C 文件 、a.H文件 是两个相关文件 ,b.c文件调用a.c文件中的定义的函数void a_function1(void);
一般文件书写格式:
/***************************
a.H文件
*****************************/
void a_fuction1(void); // 声明该函数
/***************************
a.C 文件
*****************************/
#include"a.h"
//----------此处顺便介绍一下<>和引号的区别,【引号】表示优先在当前工程文件目录查找文件,再再IDE安装文件目录查找该文件,【<>】 表示直接在IDE安装目录下查找该文件,兵添加到当前C文件的当前位置;
void a_fuction1(void) // 定义该函数的具体实现
{
unsigned char aaa;
aaa=11;
}
/***************************
b.C 文件
*****************************/
extern void a_fuction1(void); // 告诉编译器该函数在别处已经声明并且定义了,无需为其重新分配地址空间
//==============================================================
以下是准备推荐一种c文件、h文件的写法
/***************************
aa.H文件
*****************************/
#ifdef aa_h
#define EXT // -------定义EXT 为空
#else
#define EXT extern //--------- 定义EXT 为extern ,后面的剧情大家大概猜到了吧
#endif
EXT void aa_fuction1(void); // 声明该函数
/***************************
aa.C 文件
*****************************/
#define aa_h //此处有的定义虽为空,但是还是定义了----很重要的定义
#include"aa.h"
void aa_fuction1(void) // 定义该函数的具体实现
{
unsigned char aaa;
aaa=11;
}
/***************************
bb.C 文件
*****************************/
#include"aa.h" // 直接包含头文件即可实现调用,不用逐个书写extern +函数/全局变量的形式,比较简洁
注: 如果有其他疑问或者建议,可以在下方回帖,欢迎讨论。
1) 经常有初学者对.h文件和.c文件里面函数/变量的声明 、调用的方式无法理解或者无法很直接透彻的方式理解,本帖对此理解应该有所帮助;
2)很多写了2、3年C的单片机应用开发者对.h文件 、 .c文件的书写感觉规范性不够好,书写比较乱,本贴可以给出一种比较清晰、明了的书写格式;
3)函数声明、其他C文件调用另一个C文件的函数使用extern关键字比较频繁、编译器偶尔报错偶尔不报错,导致运行时代码无故死机、重启,有时跟函数声明、调用的有问题而编译器没有报错,本贴但愿能给出简单的建设性意见。
一般文件声明、定义、调用的格式如下:
应用场景介绍:a.C 文件 、a.H文件 是两个相关文件 ,b.c文件调用a.c文件中的定义的函数void a_function1(void);
一般文件书写格式:
/***************************
a.H文件
*****************************/
void a_fuction1(void); // 声明该函数
/***************************
a.C 文件
*****************************/
#include"a.h"
//----------此处顺便介绍一下<>和引号的区别,【引号】表示优先在当前工程文件目录查找文件,再再IDE安装文件目录查找该文件,【<>】 表示直接在IDE安装目录下查找该文件,兵添加到当前C文件的当前位置;
void a_fuction1(void) // 定义该函数的具体实现
{
unsigned char aaa;
aaa=11;
}
/***************************
b.C 文件
*****************************/
extern void a_fuction1(void); // 告诉编译器该函数在别处已经声明并且定义了,无需为其重新分配地址空间
//==============================================================
以下是准备推荐一种c文件、h文件的写法
/***************************
aa.H文件
*****************************/
#ifdef aa_h
#define EXT // -------定义EXT 为空
#else
#define EXT extern //--------- 定义EXT 为extern ,后面的剧情大家大概猜到了吧
#endif
EXT void aa_fuction1(void); // 声明该函数
/***************************
aa.C 文件
*****************************/
#define aa_h //此处有的定义虽为空,但是还是定义了----很重要的定义
#include"aa.h"
void aa_fuction1(void) // 定义该函数的具体实现
{
unsigned char aaa;
aaa=11;
}
/***************************
bb.C 文件
*****************************/
#include"aa.h" // 直接包含头文件即可实现调用,不用逐个书写extern +函数/全局变量的形式,比较简洁
注: 如果有其他疑问或者建议,可以在下方回帖,欢迎讨论。
抢个沙发,小编写的很好!
谢谢小编分享。
你好,头文件里可以定义变量吗?如果可以,怎么定义
很好的用法,谢谢分享
没太明白,extern void aa_fuction1(void); 和 void aa_fuction1(void);都是外部声明吧?
个人感觉都一样。
不错,学习了
不错,值得新手学习