c语言模块化编程
C语言模块化编程(封装)
- 模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明。模块化的实现方法和实质:将一个功能模块的代码单独编写成一个.c文件,然后把该模块的接口函数放在.h文件中。
- 对外发布的模块调用本质上是一个编译好的.so或.a或.o的二进行制文件加一个.h文件的组。
- 不要在.h文件中定义变量,如果不同的模块包含该.h文件,则在不同的模块中该变量对应不同的地址。
- 模块内的函数和模块内的全局变量需在.c 文件开头冠以static 关键字声明,一方面是限定了函数的作用范围只是在本模块中起作用,另一方面也给人传达这样的信息:该函数不会被其他模块调用。
- 函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变,赋值操作除外。
- 一个模块提供给其它模块调用的外部函数及数据需在.h 中文件中冠以extern 关键字声明。
- extern会破坏模块的封装性,不建议使用, 因此extern一般用于全局变量的声明。
extern的预处理示例:
/* in var_a.h */
#ifdef VAR_GLOBAL
#define VAR_EXT
#else
#define VAR_EXT extern
#endif VAR_EXT int var1;
VAR_EXT int var2;
如果var_b.h包含了var_a.h且在var_b.h中有以下宏定义
#define VAR_GLOBAL
由于VAR_GLOBAL被定义为空,于是变量展开为
int var1;
int var2;
如果在var_b.h包含了var_a.h但在var_b.h中没有以上宏定义则变量展开为
extern int var1;
extern int var2;
c语言模块化编程的更多相关文章
- 单片机 C 语言模块化编程
好的开始是成功的一半 通过上一章的学习,我想你已经掌握了如何在程序中释放CPU了.希望能够继续坚持下去.一个良好的开始是成功的一半.我们今天所做的一切都是为了在单片机编程上做的更好. 在谈论今天的主题 ...
- keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧! 后来学会了在keil里进行模块化编程,即只把功能相同或 ...
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
一.关于全局变量的定义.声明.引用: (只要是在.h文件中定义的变量,然后在main.c中包含该.h文件,那么定义的变量就可以在main函数中作为全局变量使用) 方法1: 在某个c文件里定义全局变量后 ...
- Javascript模块化编程之难处
接着上一篇“Javascript模块化编程之Why”说起,Javascript担子重了之后程序也就复杂了.在大把语言都模块化编程的形势下,Javascript也不可能袖手旁观啊,毕竟这是一条经过实践检 ...
- 【C语言探索之旅】 第二部分第一课:模块化编程
内容简介 1.课程大纲 2.第二部分第一课: 模块化编程 3.第二部分第二课预告: 进击的指针,C语言王牌 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...
- 嵌入式C语言之---模块化编程
当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干.你需要和你的小组成员分工合作,一起完成项目,这就要求小组成员各自负责一部分工程.比如你可能只是负责通讯或者显示这一块.这个时候,你就应 ...
- Javascript模块化编程(三):require.js的用法
Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...
- Javascript模块化编程(二):AMD规范
Javascript模块化编程(二):AMD规范 作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_d ...
- Javascript模块化编程(二):AMD规范(转)
这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...
随机推荐
- python3.5 字典遍历
1.遍历字典 dict={'} for key in dict: print(key+':'+dict[key]) ssh://root@192.168.0.204:22/usr/bin/python ...
- LeetCode.933-最近通话次数(Number of Recent Calls)
这是悦乐书的第357次更新,第384篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第219题(顺位题号是933).写一个类RecentCounter来计算最近的请求. 它 ...
- idea中在编码时候经常用到的快捷键
Ctrl+z 撤销 Ctrl+shift+z 重做 复制 粘贴 剪贴 其中idea可以在光标的当前行不用选中代码,只用ctrl+c,ctrl+v,ctrl+x 就可以复制,粘贴,剪贴 光标的那一行的代 ...
- shell脚本判断里面的字符含义
[ -s FILE ] 如果 FILE 存在且大小不为0则为真. [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c ...
- python 并发编程 进程池与线程池
一 进程池与线程池 1.为什么需要进程池和线程池 基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是: 服务端的程序运行在一台机器身上,一台机器性能是有极限的,不能无限开线程 服务的 ...
- Codeforces Round #590 (Div. 3)(e、f待补
https://codeforces.com/contest/1234/problem/A A. Equalize Prices Again #include<bits/stdc++.h> ...
- 洛谷 P5239 回忆京都 题解
题面 裸的杨辉三角前缀和,但----- 在求前缀和的时候有可能得到一个负数(由于取模的原因),所以一定要加上模数后再取模!!!! #include <bits/stdc++.h> #def ...
- es6 filter() 数组过滤方法总结(转载)
1.创建一个数组,判断数组中是否存在某个值 var newarr = [ { num: 1, val: 'ceshi', flag: 'aa' }, { num: 2, val: 'ceshi2', ...
- iOS常用的数学函数
1. 三角函数 double sin (double);正弦 double cos (double);余弦 double tan (double);正切 2 .反三角函数 ...
- Delphi 数据类型