昨晚看了下模块化编程的东西,把自己的工程整了整,可惜没成功。今早发神经似的起床敲代码,很快就发现了错误,原来是条件宏定义的头文件名忘改了,汗!!!

整理下模块化编程的要点,感谢以下三位UP主的帖子:

http://blog.csdn.net/zhzht19861011/article/details/5974945

http://jyqcxl122621.blog.163.com/blog/static/61323392201172392519647/

http://bbs.mydigit.cn/read.php?tid=536508

通俗来讲:

1. h中只有宏定义和变量、函数声明,.c中包含.h,并有变量、函数定义。

2. 其他模块想要引用该模块的变量和函数,需在该模块.h中对变量、函数的声明前加extern。

3. 为避免重复定义,每个.h都应写为以下形式(以HAL.h为例):

#ifndef __HAL_H__

#define __HAL_H__

#include

#define xxx xxxx

sbit ss = xxx;

.....

#endif

一、关于全局变量的定义、声明、引用: 在某个c文件里定义全局变量后,在其它c文件要用,则在要用c文件里用extern进行声明。

(1)在定义全局变量时可同时将其初始化

(2)在用extern声明时不能再初始化,否则编译器报错

举例:有两个c文件分别为one.c和two.c,two中要用到one中的全局变量N,怎么办

答案:在one.c中定义且初始化:u8 N = 0;

再在one.h中用extern声明:extern u8 N;(注:此处不能加= 0)

最后在two.c中包含one.h:#include "one.h"

全局变量的定义和初始化放在c文件中,声明放在对应的h文件中。 且要注意h文件里应仅有相应c文件里的函数和变量的声明,和相应c文件无关的东西不应该有。

二、关于头文件的包含:

头文件的包含就比较简单了:在相应c文件里一一包含所需的h文件即可。但千万不要将这些头文件全部放在c文件的相应头文件里,虽然这样会使c文件仅包含了一个头文件,看起来比较简洁,但这样会影响它的h文件的“纯洁性”。

在此提醒下新手们:要将c文件和其对应的h文件看成一体,即它们互相有着紧密联系;移植时,将它们同时搬走就行!

三、关于结构体类型的定义:

1、若结构体类型只需要在某个c文件中使用,那么就在相应c文件里定义该结构体即可。

2、若结构体类型要在多个c文件中使用,那么就应该在头文件中定义该结构体,再在要用它的文件中包含结构体定义 所在的头文件即可。

C语言模块化程序设计需理解如下概念: (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明; (2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明; (3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明; (4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。

keil c语言模块化编程,keil C模块化编程总结相关推荐

  1. keil c语言循环嵌套,keil软件中C语言嵌套汇编

    一.讲解背景 在单片机学习的过程中,掌握一点汇编语言是非常有必有的,作为低级语言汇编语言在单片机开发中有它不可取代的作用,比如每条指令可以精确的确定延时时间,便于理解非常适合硬件工程师学习.但是要提高 ...

  2. keil c语言编译运行,Keil的c语言编译器

    我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论. (1)全局变量:如果程序中定义了全局变量,而且初始值不是0.此时,在程序调到main()函数执行前,除了要进 ...

  3. keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法

    前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...

  4. keil c语言绝对值函数,keil编写C程序是不是不能在函数内定义变量啊,求大神

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 肯定可以的:比如 程序动态显示字符 显示光标和光标闪烁打开效果 --------------------------------------------- ...

  5. keil c语言字符串赋值,keil c指针变量赋值 请指点下迷津

    这个是我在多路温湿度控制系统中用到的接收方法,Rs485方式的 如果想采用Rs485的朋友也可以参考一下 #define FRAME_HEAD          0x24 uchar RxBuf[7] ...

  6. keil4c语言和汇编混合,keil C语言与汇编语言混合编程

    keil C语言与汇编语言混合编程 1. C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ; Assembler Code Here #pragm ...

  7. 单片机c语言too many actual parameter,keil c语言编程常见错误分析.doc

    keil c语言编程常见错误分析.doc 1. Warning 280:'i':unreferenced local variable 说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i ...

  8. Javascript模块化编程系列二: 模块化的标准化(CommonJS AMD)

    前言 Javascript模块化编程系列一: 模块化的驱动 在前一篇介绍了为什么要进行Javascript模块化编程.至于如何实现模块化,不同的开发组织和个人具体的实现方式肯定是不一样.如何统一一个规 ...

  9. keil c语言pdf,Keil软件“C语言”与“汇编”混编 —— 相关知识整理.pdf

    Keil软件"C语言"与"汇编"混编 -- 相关知识整理.pdf Keil 软件软件C 语言语言与与汇编汇编混编混编 相关知识整理相关知识整理 用 Keil 在 ...

  10. keil c语言中断怎么写,如何利用keil C实现单片机中断功能

    直接访问寄存器和端口 定义 sfr P0 0x80 sfr P1 0x81 sfr ADCON; 0xDE sbit EA  0x9F 操作 ADCON = 0x08; P1 = 0xFF; io_s ...

最新文章

  1. java中如何实现两个值互换
  2. PHP只下载不打开文件
  3. 百度面试测试开发工程师内容
  4. sqlyog怎么设置默认值_物联网卡三网APN设置
  5. java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用
  6. php继承exten,es6,extends_react中通过extend继承,父组件为什么能访问子组件的属性,es6,extends,react.js - phpStudy...
  7. js 中exec、test、match、search、replace、split用法
  8. python 安卓库_Python 开发安卓Android及IOS应用库Kivy安装尝试
  9. Spring常用注解
  10. 【从零开始学架构-李运华】04|复杂度来源:高性能
  11. C语言移动营业厅程序设计,C语言程序设计 陈锐主编,清华大学出版社)例题代码 前7章.doc...
  12. Windows键和Delete键不能用解决方法
  13. 运维屌丝回答网传Linux运维面试题(一)
  14. Unity Shader - ARB_precision_hint_fastest / ARB_precision_hint_nicest 命令
  15. 如何安装配置eosjs并连接到EOS区块链
  16. 2017-4-15,16
  17. MC34063芯片应用
  18. ffmpeg 各版本下载以及在线安装
  19. iOS-UITableView 中自定制cell上UIButton互斥事件
  20. mysql表中文字段提取拼音首字母最便捷实现,中文按拼音首字母排序

热门文章

  1. 802.1AE保护局域网安全
  2. php和mysql入门_PHP和MySQL入门(10)
  3. 为什么华为在发布会不提鸿蒙,华为又要开发布会?这次没有手机,鸿蒙系统要当主角!...
  4. CharSequence和String的区别
  5. linux系统启动报错:[contains a file system with errors, check forced]的解决方法参考
  6. php自动断词,PHP自动分页、防止英文单词被截段、去除HTML代码
  7. python坐标轴刻度为经纬度_python各类经纬度转换
  8. python数据可视化地图_python--地图可视化
  9. php mysql返回条数据,php – MySQL两次返回数据
  10. r语言electricity数据集_R语言学习10-查看数据