keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧!
后来学会了在keil里进行模块化编程,即只把功能相同或相近的函数写在同一个c文件,这样以来一个项目往往由很多个c文件组成,但又带来一个问题即是某些c文件之间需要相互通信,一般我们都采用了全局变量,对吧。很多同学虽然知道在其它c文件里引用全局变量要用extern进行声明,但对此操作时往往思路不清,迷迷糊糊,经常遇到一堆错误提示,然后一个一个排除,既费时又费力,可怕的是下次还会遇到同样的问题。本人曾经也遇到过类似问题,故在此将模块化编程里的全局变量、结构体、头文件相关问题详述一遍,大家照着做,就能确保无误!
一、关于全局变量的定义、声明、引用:
方法1:在某个c文件里定义全局变量后,在其它c文件要用,则在要用c文件里用extern进行声明。说来轻巧但还是很多同学会出问题。请看下面注意事项方可解决!
注:
(1)在定义全局变量时可同时将其初始化
(2)在用extern声明时不能再初始化,否则编译器报错
举例:有两个c文件分别为one.c和two.c,two中要用到one中的全局变量N,怎么办?
答案:在one.c中定义且初始化:u8 N = 0;
再在two.c中声明:extern u8 N;(注:此处不能加= 0)
方法2:同样对于方法1中的例子,我推荐采用方法2。
答案:在one.c中定义且初始化:u8 N = 0;
再在one.h中用extern声明:extern u8 N;(注:此处不能加= 0)
最后在two.c中包含one.h:#include "one.h"
由于方法2的可移植性较方法一要强,故采用2较好!
对方法2的总结为:全局变量的定义和初始化放在c文件中,声明放在对应的h文件中。 且要注意h文件里应仅有相应c文件里的函数和变量的声明,和相应c文件无关的东西不应该有。
二、关于头文件的包含:
头文件的包含就比较简单了:在相应c文件里一一包含所需的h文件即可。但千万不要将这些头文件全部放在c文件的相应头文件里,虽然这样会使c文件仅包含了一个头文件,看起来比较简洁,但这样会影响它的h文件的“纯洁性”。
在此提醒下新手们:要将c文件和其对应的h文件看成一体,即它们互相有着紧密联系;移植时,将它们同时搬走就行!
三、关于结构体类型的定义:
1、若结构体类型只需要在某个c文件中使用,那么就在相应c文件里定义该结构体即可。
2、若结构体类型要在多个c文件中使用,那么就应该在头文件中定义该结构体,再在要用它的文件中包含结构体定义所在的头文件即可。
最后,相信很多人都遇到过上述困惑吧,但愿本文能为你解惑!
keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法的更多相关文章
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
一.关于全局变量的定义.声明.引用: (只要是在.h文件中定义的变量,然后在main.c中包含该.h文件,那么定义的变量就可以在main函数中作为全局变量使用) 方法1: 在某个c文件里定义全局变量后 ...
- c语言模块化编程
C语言模块化编程(封装) 模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明.模块化的实现方法和实质:将一个功能模块的代码单独编写成一个.c文件,然后把该模块的接口函 ...
- 模块化编程时,#include到底要放在哪里?
结合我自己的经验,谈一谈模块化编程时#include应该出现的位置.总结起来大体有二条规则: 一.规则1:只包含必要的头文件 看下面这个模块: ===foo.c==== #include <st ...
- Go语言基础之8--面向对象编程1之结构体(struct)
一.结构体详解 1.1 声明和定义 1.Go中面向对象是通过struct来实现的, struct是用户自定义的类型 2.Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数 ...
- 编程时 对 用途这个字段定义时 不要用using 这个英文
编程时 对 用途这个字段定义时 不要用using 这个英文
- C语言入门(15)——结构体与数据抽象
大多数的计算机运算是对现实世界的模拟,如果想用计算机来模拟现实世界需要用到数据抽象的方法.所谓抽象是从实际的人.物.事和概念中抽取所关心的共同特征,,忽略非本质的细节,吧这些特征用各种概念精确的加以描 ...
- C语言博客作业06——结构体&文件
C语言博客作业06--结构体&文件 1.本章学习总结 1.1思维导图 1.2.本章学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.结构体的本身并不难,但以结构体为基础的链表还是让我 ...
- Golang面向对象编程-struct(结构体)
Golang面向对象编程-struct(结构体) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是面向对象编程 面向对象编程(Object Oriented Program ...
- C语言入门(14)——结构体
整数.字符.布尔值.浮点数这些数据类型都具有单一的值,这些可称为基本数据类型.但字符串是一个例外,它由很多字符组成,像这种由基本类型组成的数据类型称为复合数据类型,正如表达式和语句有组合规则一样,由基 ...
随机推荐
- Android(java)学习笔记194:ListView编写步骤(重点)
1.ListView在我们的手机android编写程序中使用是十分广泛的,比如如下图中 短信 和 手机设置 都是ListView的效果: 手机设置: 短信: 2.正因为这 ...
- 1. 连接字符串的创建 - Lazy.Framework从零开始设计自己的ORM架构
开发初衷 注册了博客园已经有几个月了,却从来都没有上来过,本人大概从2010年开始就开始做.NET 方向的开发. 这个是我在博客园发布的第一个帖子. 主要就是说说最近在写的一个ORM架构. 本人接触的 ...
- SqlSugar简单工模式数据访问简单Demo
源代码地址:http://git.oschina.net/tiama3798/BootstrapBack_Demo 1.Model层 2.抽象层实例: 基础接口 /// <summary> ...
- mvc5 + ef6 + autofac搭建项目(四).1视屏上传生成截图
即上一篇中上传涉及到的 一个视频生成截图的问题,这个很简单,这是上一篇中的代码片段 #region 视频上传,生成默认展示图片(自动剪切) try { string fileSavePath = Da ...
- 状态CSS
<span style="background-color: #999999 !important;color:#FFFFFF;font-size: 11px;height: 18px ...
- Oracle 11g-R2 SQL Developer连接MSSQL2008
操作系统环境:WINDOWS8.1 工具: Oracle 11g-R2 SQL Developer 网络资源:http://sourceforge.net/project/showfiles.php ...
- Java Map集合按照key和value排序之法
一.理论基点 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black-Tre ...
- Javascript中bind()方法的使用与实现
对于bind,我愣了下,这个方法常用在jquery中,用于为被选元素添加一个或多个事件处理程序. 查了下手册,发现bind的作用和apply,call类似都是改变函数的execute context, ...
- jQuery插件综合应用(二)文字为主的页面
一.介绍 文字内容是每个网站都有的内容,网站在展示文字内容时,总是比图片.视频等富媒体内容要难一些,因为富媒体容易被用户接受.尤其是越多的文字内容越难以被用户通篇的阅读,跳跃式阅读往往是阅读的主要方式 ...
- DOM 之 document 查找元素方法
DOM 之 document 查找元素方法 getElementById("idName"); // 始终取得第一个 idName 的元素 getElementsByTagName ...