C语言接口与实现方法实例详解
本文以实例形式详细讲述了C语言接口与实现方法,对于深入掌握C语言程序设计有一定的借鉴价值。分享给大家供大家参考。具体分析如下:
一般来说,一个模块有两部分组成:
接口
C语言对接口和实现的分离只提供最基本的支持,但是简单的约定能给接口/实现方法论带来巨大的好处。
下面的例子说明了本篇文章的接口中所使用的一些约定、接口:
externintArith_max(intx,inty); externintArith_min(intx,inty); externintArith_div(intx,inty); externintArith_mod(intx,inty); externintArith_ceiling(intx,inty); externintArith_floor(intx,inty);
该接口的名字为Arith,接口头文件也相应地命名为arith.h,接口的名字以前缀的形式出现在接口的每个标识符中。模块名不仅提供了合适的前缀,而且还有助于整理客户调用程序代码。
Arith接口还提供了一些标准C函数库中没有但是很有用的函数,并为出发和取模提供了良好的定义,而标准C中并没有给出这些操作的定义和只提供基于实现的定义。
实现
一个实现导出一个接口,它定义了必要的变量和函数以提供接口所规定的功能,在C语言中,一个实现是由一个或多个.c文件提供的,一个实现必须提供其导出的接口所指定的功能。实现应包含接口的.h文件,以保证它的定义和接口的声明时一致的。
Arith_min和Arith_max返回其整型参数中的最小值和最大值:
intArith_max(intx,inty){ returnx>y?x:y; } intArith_min(intx,inty){ returnx>y?y:x; }
Arith_div返回y除以x得到的商,Arith_mod返回相应的余数。当x与y同号的时候,Arith_div(x,y)等价于x/y,Arith_mod(x,y)等价于x%y
当x与y的符号不同的时候,C的内嵌操作的返回值就取决于具体的实现:
如果-13/5=2,-13%5=-3,如果-13/5=-3,-13%5=2
标准库函数总是向零取整,因此div(-13,2)=-2,Arith_div和Arith_mod的语义同样定义好了:它们总是趋近数轴的左侧取整,因此Arith_div(-13,5)=-3,Arith_div(x,y)是不超过实数z的最大整数,其中z满足z*y=x。
Arith_mod(x,y)被定义为x-y*Arith_div(x,y)。因此Arith_mod(-13,5)=-13-5*(-3)=2
函数Arith_ceiling和Arith_floor遵循类似的约定,Arith_ceiling(x,y)返回不小于实数商x/y的最小整数
Arith_floor(x,y)返回不超过实数商x/y的最大整数
完整实现代码如下:
#include"arith.h" intArith_max(intx,inty){ returnx>y?x:y; } intArith_min(intx,inty){ returnx>y?y:x; } intArith_div(intx,inty){ if(-13/5==-2 &&(x<0)!=(y<0)&&x%y!=0) returnx/y-1; else returnx/y; } intArith_mod(intx,inty){ if(-13/5==-2 &&(x<0)!=(y<0)&&x%y!=0) returnx%y+y; else returnx%y; } intArith_floor(intx,inty){ returnArith_div(x,y); } intArith_ceiling(intx,inty){ returnArith_div(x,y)+(x%y!=0); }
抽象数据类型
抽象数据类型(abstractdatatype,ADT)是一个定义了数据类型以及基于该类型值提供的各种操作的接口
一个高级类型是抽象的,因为接口隐藏了它的表示细节,以免客户调用程序依赖这些细节。下面是一个抽象数据类型(ADT)的规范化例子--堆栈,它定义了该类型以及五种操作:
#ifndefSTACK_INCLUDED #defineSTACK_INCLUDED #defineTStack_T typedefstructT*T; externTStack_new(void); externintStack_empty(Tstk); externvoidStack_push(Tstk,void*x); externvoid*Stack_pop(Tstk); externvoidStack_free(T*stk); #undefT #endif
实现
包含相关头文件:
#include<stddef.h> #include"assert.h" #include"mem.h" #include"stack.h" #defineTStack_T
Stack_T的内部是一个结构,该结构有个字段指向一个栈内指针的链表以及一个这些指针的计数:
structT{ intcount; structelem{ void*x; structelem*link; }*head; };
Stack_new分配并初始化一个新的T:
TStack_new(void){ Tstk; NEW(stk); stk->count=0; stk->head=NULL; returnstk; }
其中NEW是一个另一个接口中的一个分配宏指令。NEW(p)将分配该结构的一个实例,并将其指针赋给p,因此Stack_new中使用它就可以分配一个新的Stack_T
当count=0时,Stack_empty返回1,否则返回0:
intStack_empty(Tstk){ assert(stk); returnstk->count==0; }
assert(stk)实现了可检查的运行期错误,它禁止空指针传给Stack中的任何函数。
Stack_push和Stack_pop从stk->head所指向的链表的头部添加或移出元素:
voidStack_push(Tstk,void*x){ structelem*t; assert(stk); NEW(t); t->x=x; t->link=stk->head; stk->head=t; stk->count++; } void*Stack_pop(Tstk){ void*x; structelem*t; assert(stk); assert(stk->count>0); t=stk->head; stk->head=t->link; stk->count--; x=t->x; FREE(t); returnx; }
FREE是另一个接口中定义的释放宏指令,它释放指针参数所指向的空间,然后将参数设为空指针
voidStack_free(T*stk){ structelem*t,*u; assert(stk&&*stk); for(t=(*stk)->head;t;t=u){ u=t->link; FREE(t); } FREE(*stk); }
完整实现代码如下:
#include<stddef.h> #include"assert.h" #include"mem.h" #include"stack.h" #defineTStack_T structT{ intcount; structelem{ void*x; structelem*link; }*head; }; TStack_new(void){ Tstk; NEW(stk); stk->count=0; stk->head=NULL; returnstk; } intStack_empty(Tstk){ assert(stk); returnstk->count==0; } voidStack_push(Tstk,void*x){ structelem*t; assert(stk); NEW(t); t->x=x; t->link=stk->head; stk->head=t; stk->count++; } void*Stack_pop(Tstk){ void*x; structelem*t; assert(stk); assert(stk->count>0); t=stk->head; stk->head=t->link; stk->count--; x=t->x; FREE(t); returnx; } voidStack_free(T*stk){ structelem*t,*u; assert(stk&&*stk); for(t=(*stk)->head;t;t=u){ u=t->link; FREE(t); } FREE(*stk); }
相信本文所述对大家的C程序设计有一定的借鉴价值。
相关文章
- 常用经典SQL语句大全完整版–详解+实例
- C语言读取txt文件实例
- linux下socket编程实例_C语言窗口编程
- 【Android 应用开发】Activity 返回堆栈管理 ( 栈内复用模式 singleTask | 单实例模式 singleInstance )
- MySQL与C语言开发实例分析(mysql与c)
- merge into和xml.modify 实例演示
- 如何利用Redis开启多个实例(开几个redis实例)
- MySQL使用C语言实现分页功能实例(c mysql 分页例子)
- MySQL代码实例快速掌握C语言编程(c mysql代码实例)
- AndroidActivity完全结束并退出程序的实例
- .Net读取Excel返回DataTable实例代码
- Python设计模式之单例模式实例
- python中的实例方法、静态方法、类方法、类变量和实例变量浅析
- C语言内嵌汇编API内存搜索引擎实例
- 在Golang中使用C语言代码实例
- Python标准库os.path包、glob包使用实例
- C语言安全之数组长度与指针实例解析
- C语言单链队列的表示与实现实例详解
- C语言循环队列的表示与实现实例详解
- 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器
- php基于表单密码验证与HTTP验证用法实例
- C语言柔性数组实例详解
- Cocos2d-xUI开发之CCControlButton控件类实例
- C语言连续子向量的最大和及时间度量实例