创建一个函数库
上述程序中的rand和bubble_sort函数很实用,很可能在您写其他程序时也能派上用场。为了能更方便地重复使用,您可以为它们创建一个实用工具函数库。
所有的函数库都包括两部分:头文件和源文件。头文件的标准扩展名是.h,它包含函数库的一些信息,使用这个库的程序需要知道这些信息。一般来说,头文件包括常数,类型声明以及该函数库所提供函数的原型声明。请将下面的头文件代码录入,以文件名util.h保存。
/* util.h */
extern int rand();
extern void bubble_sort(int, int []);
这两行是函数原型声明。c语言中用“extern”指明从外部链接的函数。使用旧式编译器时须将bubble_sort的参数列表清空。
然后录入下面的代码,以文件名util.c保存。
/* util.c */
#include util.h
int rand_seed=10;
/* 摘自 k&r
- 产生一个0至32767之间的随机数。*/
int rand()
{
rand_seed = rand_seed * 1103515245 +12345;
return (unsigned int)(rand_seed / 65536) % 32768;
}
void bubble_sort(int m,int a[])
{int x,y,t; for (x=0; x < m-1; x++)
for (y=0; y a[y+1])
{t=a[y]; a[y]=a[y+1]; a[y+1]=t; } }
注意,本文件包含了自己的头文件(util.h)而且用的是引号而不是,因为尖括号只用于系统库。如您所见,这里的代码和普通c代码没什么区别。请注意,因为rand_seed变量没有在头文件中出现,所以对使用本库的程序来说是不可见的,也不能被修改。这就叫做信息隐藏。在int前面加上static关键字会强制信息被完全隐藏。
请录入下面的主函数,以文件名main.c保存。
#include
#include util.h
#define max 10
int a[max];
void main()
{ int i,t,x,y; /* 填充数组元素 */
for (i=0; i < max; i++)
{a[i]=rand(); printf(%dn,a[i]);}
bubble_sort(max,a); /* 打印排序后的数组 */
printf(--------------------n); for (i=0; i < max; i++)
printf(%dn,a[i]); }
这个程序包含了该实用工具函数库。使用函数库的主要好处是主程序的代码被大大精简了。
函数库的编译和运行
要编译函数库,请在命令行键入如下命令(假设您使用的是unix。若您的系统用的是cc则用cc替换gcc):
gcc -c -g util.c
-c选项使编译器为函数库生成一个的目标文件,它包含了函数库的二进制代码,独立存在于名为util.o的目标文件中。目标文件只有在和一个包含主函数的程序文件链接后才能执行。
要编译主程序,请键入:
gcc -c -g main.c
此命令将生成一个文件名为main.o的目标文件,它包含了主程序的二进制代码。要创建包含整个程序机器代码的可执行文件,请键入下面的命令将两个目标文件链接:
gcc -o main main.o util.o
这条命令将main.o和util.o进行链接并生成可执行程序main。键入main后即可运行。
用makefile可以在一定程度上简化函数库的使用。
来看看温度传感器的十八般武艺
到2022年中国数据中心业务市场规模将超过3200.5亿元
议程直击 | 第二届OpenHarmony技术大会——OS原生智能分论坛
荣耀Note9什么时候上市?全面屏+大电池新机下月发布,要价3000你们会买吗?
基于STM32完成FATFS文件系统移植与运用
C语言入门教程-创建一个函数库
Microsemi宣布提供新一代工业温度碳化硅标准功率模块
对于医疗电子而言,3D打印意味着什么?
新国标将把老年代步车划归乘用车!
云计算增速达25% 亚太第一的阿里云在助攻
半导体教父张忠谋:RFID将抢物联网商机
英飞拓致力于推进AI在安防领域的普惠化
博通CEO:3000亿可穿戴设备市场孕育下一个苹果
法Carmat人工心脏将首次植入于人体进行试验
三星Galaxy S10概念图亮相:正面没开孔 屏下前置镜头有望首发
深耕产业服务14年 上达电子斩获BOE SPC 2018“卓越服务奖”
教育信息化2.0时代开场:交互智能平板行业迎来洗牌期
2020年中国智能水表行业有什么发展
为什么说物联网是一场连接革命
改善分数分频锁相环合成器中的整数边界杂散状况