找回密码
 立即注册
查看: 6056|回复: 8

Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

积分
3599
发表于 2023-4-21 22:08:02 | 显示全部楼层 |阅读模式
在多文件项目的源文件中声明并使用外部变量和外部函数-Keil小技巧
在Keil环境下开发比较大的项目时,往往需要在项目中加入多个源文件
而不同源文件内,可能会有一些变量和函数是开放为其它源文件使用的
但默认情况下,在源文件内部定义的变量和函数只在本源文件可见(可使用)
如果需要跨源文件使用则需要遵循一定的规则进行定义和声明

对于需要跨源文件访问变量
1、变量必须定义为全局变量
     所谓全局变量就是在函数外部定义,在函数内部定义的变量为局部变量
     由于局部变量的作用域仅在定义的函数内部,且生命周期在函数返回时就结束了
     所以要使变量能跨源文件访问,变量必须定义为全局变量
2、变量必须定义为非静态变量
     使用static关键字定义的变量为静态变量,静态变量作用域仅为本源文件,外部源文件不可访问。
     所以要使变量能跨源文件访问,变量必须定义为非静态变量,即定义时不要使用static关键字
      Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-1.png
3、不同的源文件中不可定义名称相同的全局变量
     如果在不同源文件中定义名称相同的全局变量,编译器会如下错误提示
      Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-2.png
4、在需要使用外部变量的源文件内使用extern声明变量
      Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-3.png
     如果需要在多个源文件中使用同一个外部变量,可将上面的外部声明语句
     放在.h文件中,在需要使用这个变量的源文件中include一下这个头文件即可

同样的,若需要跨源文件调用外部函数:
1、函数必须定义为非静态函数
     使用static关键字定义的函数为静态函数,静态函数作用域仅为本源文件,外部源文件不可访问。
     所以要使函数能跨源文件访问,必须定义为非静态函数,即定义函数时不要使用static关键字
      Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-4.png
2、不同的源文件中不可定义名称相同的非静态函数
     如果在不同源文件中定义名称相同的非静态函数时,编译器会如下错误提示
      Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-1.png
3、在需要调用外部函数的源文件内直接声明一下即可
     对于外部函数声明,是否使用extern关键字,编译时都可通过
      Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-6.png
     如果需要在多个源文件中使用同一个外部函数,可将上面的外部声明语句
     放在.h文件中,在需要调用这个函数的源文件中include一下这个头文件即可

声明并使用外部变量和外部函数.zip

47.51 KB, 下载次数: 218

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-5-2 09:46:32 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2023-5-2 08:09:51 | 显示全部楼层
好贴好文,顶一下
不停地学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-5-2 17:11:08 | 显示全部楼层
延伸阅读:
如何在 KEIL C251编译器中 将函数编译到指定地址 !
第一步、直接编译,打开MAP文件,并找到函数funtest的链接名称,如下图

第二步、在项目选项的“L251 Locate”页进行如下设置

第三步、重新编译即可

回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:372
  • 最近打卡:2025-05-01 10:53:48

12

主题

125

回帖

1685

积分

金牌会员

积分
1685
发表于 2023-7-10 21:05:39 | 显示全部楼层
简单的举例说就是先在变量使用的 KEY.C 文件内声明一个全局变量 bit KEY_OK   再在对应的  KEY.H内部声明引用 extern bit KEY_OK;       最后需要调用这个KEY_OK变量的 Uart.C 文件的开头声明下#include  "KEY.H" 就可以调用这个变量并对其进行操作     同样的其他文件调用只要在前面加入#include  "KEY.H"  就可以调用使用了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2023-12-19 17:41:58 | 显示全部楼层
对于现代的编程思想来说,,单片机的开发已经不在是,一个人一块板一个电脑一晚上了。所以对于外部变量的使用,请给我API让我去调用。对于我的错误输入,应该给我响应的错误反馈。不能在简单的extern 一下就用。当然,,如果这些文件是你自己一个人的,那就无所谓了,无非是降低一点移植性。但如果你是给别人用,,那就会让人很抓马了。编程的思想是不是也应在在论坛里说一说了。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:362
  • 最近打卡:2025-05-02 00:24:28

0

主题

43

回帖

700

积分

高级会员

积分
700
发表于 2024-8-19 21:40:32 | 显示全部楼层
写得不错,学习了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:321
  • 最近打卡:2025-05-01 21:04:13
已绑定手机

21

主题

487

回帖

1027

积分

金牌会员

积分
1027
发表于 2024-8-21 12:09:29 | 显示全部楼层
这个很好,有些没用到的功能也熟悉一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:117
  • 最近打卡:2025-03-06 09:50:21

6

主题

142

回帖

638

积分

高级会员

积分
638
发表于 2024-11-12 20:48:29 | 显示全部楼层
在本文件声明,在其他引用文件中声明外部变量
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:13 , Processed in 0.134267 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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