C语言接口的定义与实现一个模块有两部分组成:接口和实现 。接口指明模块要做什么,它声明了使用该模块的代码可用的标识符、类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实现能够提供接口所指定的功能 。每个实现可能使用不同的算法和数据结构 , 但是它们都必须符合接口所给出的使用说明 。客户调用程序是使用某个模块的一段代码,客户调用程序导入接口 , 而实现导出接口 。由于多个客户调用程序是共享接口和实现的,因此使用实现的目标代码避免了不必要的代码重复,同时也有助于避免错误,因为接口和实现只需一次编写和调试就可多次使用
实现
一个实现导出一个接口,它定义了必要的变量和函数以提供接口所规定的功能,在C语言中,一个实现是由一个或多个.c文件提供的,一个实现必须提供其导出的接口所指定的功能 。实现应包含接口的.h文件,以保证它的定义和接口的声明时一致的 。
Arith_min和Arith_max返回其整型参数中的最小值和最大值:
int Arith_max(int x, int y) {
return xy ? x : y;
}
int Arith_min(int x, int y) {
return xy ? 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的内嵌操作的返回值就取决于具体的实现:
eg.如果-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的最大整数
完整实现代码如下:
arith.c
抽象数据类型
抽象数据类型(abstract data type,ADT)是一个定义了数据类型以及基于该类型值提供的各种操作的接口
一个高级类型是抽象的,因为接口隐藏了它的表示细节,以免客户调用程序依赖这些细节 。下面是一个抽象数据类型(ADT)的规范化例子--堆栈,它定义了该类型以及五种操作:
stack.h
实现
包含相关头文件:
#include stddef.h
#include "assert.h"
#include "mem.h"
#include "stack.h"
#define T Stack_T
Stack_T的内部是一个结构,该结构有个字段指向一个栈内指针的链表以及一个这些指针的计数:
struct T {
int count;
struct elem {
void *x;
struct elem *link;
} *head;
};
Stack_new分配并初始化一个新的T:
T Stack_new(void) {
T stk;
NEW(stk);
stk-count = 0;
stk-head = NULL;
return stk;
}
其中NEW是一个另一个接口中的一个分配宏指令 。NEW(p)将分配该结构的一个实例,并将其指针赋给p,因此Stack_new中使用它就可以分配一个新的Stack_T
当count=0时,Stack_empty返回1,否则返回0:
int Stack_empty(T stk) {
assert(stk);
return stk-count == 0;
}
assert(stk)实现了可检查的运行期错误,它禁止空指针传给Stack中的任何函数 。
Stack_push和Stack_pop从stk-head所指向的链表的头部添加或移出元素:
void Stack_push(T stk, void *x) {
struct elem *t;
assert(stk);
NEW(t);
t-x = x;
t-link = stk-head;
stk-head = t;
stk-count;
}
void *Stack_pop(T stk) {
void *x;
struct elem *t;
assert(stk);
assert(stk-count0);
t = stk-head;
stk-head = t-link;
stk-count--;
x = t-x;
FREE(t);
return x;
}
FREE是另一个接口中定义的释放宏指令,它释放指针参数所指向的空间 , 然后将参数设为空指针
void Stack_free(T *stk) {
struct elem *t, *u;
assert(stk*stk);
for (t = (*stk)-head; t; t = u) {
u = t-link;
FREE(t);
【c语言优雅的接口函数 c语言优雅的接口函数有哪些】}
FREE(*stk);
}
完整实现代码如下:
#include stddef.h
#include "assert.h"
#include "mem.h"
#include "stack.h"
#define T Stack_T
struct T {
int count;
struct elem {
void *x;
struct elem *link;
} *head;
};
T Stack_new(void) {
T stk;
NEW(stk);
stk-count = 0;
stk-head = NULL;
return stk;
}
int Stack_empty(T stk) {
assert(stk);
return stk-count == 0;
}
void Stack_push(T stk, void *x) {
struct elem *t;
assert(stk);
NEW(t);
t-x = x;
t-link = stk-head;
stk-head = t;
stk-count;
}
void *Stack_pop(T stk) {
void *x;
struct elem *t;
assert(stk);
assert(stk-count0);
t = stk-head;
stk-head = t-link;
stk-count--;
x = t-x;
FREE(t);
return x;
}
void Stack_free(T *stk) {
struct elem *t, *u;
assert(stk*stk);
for (t = (*stk)-head; t; t = u) {
u = t-link;
FREE(t);
}
FREE(*stk);
}
C语言函数接口问题!int inquire_information(struct Address_list User[]);
void output_information(int i,struct Address_list User[]);
这两个函数c语言优雅的接口函数的声明中c语言优雅的接口函数,Address_listc语言优雅的接口函数的L都是小写c语言优雅的接口函数,
而main函数中struct Address_List User[50],*p=User;这一行声明c语言优雅的接口函数,Address_List的L是大写的 。
C语言中的接口如何实现?它和函数的定义有啥区别,请C高手来指导 , 杜绝Java的接口和类的回答因为我精通JAVAC语言中接口和函数其实没什么差别,只是有些人的习惯问题,不过一叫接口的都是针对某一个模块的功能函数集合 , 像一个图片采集模块一般就会有三种方式,1、头文件和.c文件;2、头文件和.so动态库;3、头文件和.a静态库 。在进行程序编写时我们要添加头文件,在进行编译时,必须加入 , 该模块的.c或.so或.a,一种就行 。
一般我们编写小函数接口,一般需要一个.h和一个.c就行了 。函数的声明都是在.h中,实现都在.c中,当模块编写.c有点大时,我们可以为了编译时的速度,把.c文件编译成.so和.a 。
//hello.h
#ifndef _HELLO_H_
#define _HELLO_H_
//#define 宏定义也应该在这
#include stdio.h
void hello();
#endif
//hello.c
#inlcude "hello.h"
void hello() {
printf("Hello word!");
}
大概就是这样,只不过我是linux下的,函数接口定义大同小异吧
c语言函数接口实现int add(int a, int b) {
return a b;
}
2.求乘积:
int multiply(int a, int b) {
return a*b;
}
3.求商:
int divide(int a, int b) {
return a/b;
}
4.求差:
int sub(int a, int b) {
return a-b;
}
求C语言的常用函数,详细一点C语言的常用库函数
函数1 。absread()读磁盘绝对扇区函数
函数2 。abswrite()写磁盘绝对扇区函数
函数3 。atof()将字符串转换成浮点数的函数
函数4 。atoi()将字符串转换成整型数的函数
函数5 。atol()将字符串转换成长整型数的函数
函数6 。bcd()把一个数转换成对应的BCD码的函数
函数7 。bdos()
函数8 。biosdisk()调用BIOS磁盘驱动程序函数
函数9 。biosprint()调用BIOS打印机I/O接口的函数
函数10 。calloc()分配内存函数
函数11 。ceil()
函数12 。cgets()读字符串函数
函数13 。chdir()改变当前目录的函数
函数14 。_chmod()改变文件存取权限的函数
函数15 。chmod()改变文件存取权限的函数
函数16 。clock()
函数17 。close()关闭文件函数
函数18 。closegraph()关闭图形函数
函数19 。cos()
函数20 。ctrlbrk()设置ctrl-break处理程序的函数
函数21 。delay()暂停函数
函数22 。disable()屏蔽中断的宏
函数23 。enable()开硬件中断的宏
函数24 。exec()加载并运行其它程序的函数族
函数25 。farcalloc()从远堆中分配内存的函数
函数26 。farfree()从远堆中释放一块已分配内存的函数
函数27 。farmalloc()从远堆中分配内存的函数
函数28 。farrealloc()调整远堆中已分配块的函数
函数29 。fclose()关闭一个流函数
函数30 。fcloseall()关闭打开的流的函数
函数31 。feof()检查文件是否结束的函数
函数32 。fgets()从流中读取一字符串的函数
函数33 。findfirst()函数和findnext()函数
函数34 。floodfill()填充区域的函数
函数35 。floor()
函数36 。fnmerge()建立文件路径函数
函数37 。fnsplit()分解完整的路径名函数
函数38 。fopen()打开一个流函数
函数39 。FP_OFF()获取远地址偏移量的宏
函数40 。fprintf()传送输出到一个流中的函数
函数41 。FP_SEG()获取远地址段值的宏
函数42 。fscanf()格式化输入函数
函数43 。fseek()移动文件指针函数
函数44 。fwrite()把参数写入流中的函数
函数45 。gcvt()把双精度数转化成字符串的函数
函数46 。geninterrupt()执行中断函数
函数47 。getc()从流中取字符的宏
函数48 。getch()从键盘无回显地读取一字符的函数
函数49 。getchar()从stdin流中读取一个字符的函数
函数50 。getcurdir()读取指定驱动器的当前目录的函数
函数61 。getcwd()读取当前目录的函数
函数62 。getdate()读取系统日期函数
函数63 。getdfree()读取磁盘空闲空间的函数
函数64 。getdisk()读取当前磁盘驱动器号函数
函数65 。getenv()读取环境变量的当前值的函数
函数66 。getimage()将指定区域的位图象存入内存的函数
函数67 。getmaxx()返回屏幕上最大的X坐标值的函数
函数68 。getmaxy()返回屏幕上最大的Y坐标值的函数
函数69 。getpixel()读取像素颜色的函数
函数70 。getpsp()
函数71 。gets()从标准输入流stdio中读取一字符串的函数
函数72 。gettime()读取系统时间的函数
函数73 。getvect()读取中断向量函数
函数74 。getx()返回当前图形方式下位置的X坐标值的函数
函数75 。gety()返回当前图形方式下位置的Y坐标值的函数
函数76 。imagesize()返回保存图像缓冲区大小的函数
函数77 。initgraph()显示模式控制函数(初始化图形系统函数)
函数78 。inport()从端口中读入一个字的函数
函数79 。inportb()从端口读入一个字节的函数
函数80 。int86()执行中断函数(调用8086软中断函数)
函数81 。int86x()执行中断函数 (通用8086软中断接口函数)
函数82 。intdos()通用dos中断接口函数
函数83 。intdosx()通用dos中断接口函数
函数84 。intr()执行8086软中断函数(改变软中断接口函数)
函数85 。itoa()把整形数转换为字符串的函数
函数86 。kbhit()检查当前按下的键的函数
函数87 。keep()驻留并退出函数
函数88 。log()
函数89 。log10()
函数90 。_lrotl()将一个无符号长整形数左循环移位的函数
函数91 。_lrotr()将一个无符号长整形数右循环移位的函数
函数92 。lseek()移动文件指针函数
函数93 。ltoa()把长整形数转换为字符串的函数
函数94 。malloc()分配内存函数
函数95 。mkdir()创建目录函数
函数96 。mktemp()建立一个唯一的文件名的函数
函数97 。MK_FP()设置一个远指针的宏
函数98 。movedata()拷贝数据函数
函数99 。_open()打开一个文件进行读写的函数
函数100 。open()打开文件进行读写的函数
函数101 。outport()输出一个字到端口中的函数
函数102 。outportb()输出一个字节到端口中的函数
函数103 。outtextxy()在指定位置显示一字符串的函数
函数104 。peek()返回指定内存中字的函数
函数105 。peekb()返回指定内存中字节的函数
函数106 。poke()在指定的内存中存储一个字的函数
函数107 。pokeb()在指定的内存中存储一个字节的函数
函数108 。pow()
函数109 。printf()写格式化输出到stdout的函数
函数110 。putch()向屏幕输出字符的函数
函数111 。putchar()在stdout上输出字符的宏
函数112 。putenv()将字符串放入当前环境中的函数
函数113 。putimage()重新写屏函数(输出一个位图象到图形屏幕上的函数)
函数114 。putpixel()写像素点函数
函数115 。puts()输出一字符串到stdout(标准输出)的函数
函数116 。_read()读文件函数
函数117 。read()读文件函数
函数118 。realloc()重新分配内存函数
函数119 。rectangle()画一个矩形的函数
函数120 。remove()删除一个文件的函数
函数121 。rename()文件改名函数
函数122 。restorecrtmode()恢复屏幕视频模式为调用initgraph前的设置的函数
函数123 。rmdir()删除目录函数
函数124 。_rotl()将一个无符号整形数左循环移位的函数
函数125 。_rotr()将一个无符号整形数右循环移位的函数
函数126 。scanf()格式化输入函数
函数127 。searchpath()按dos路径查找一个文件的函数
函数128 。segread()读段寄存器函数
函数129 。setactivepage()设置图形输出活动页的函数
函数130 。setcolor()设置当前要画的线颜色的函数
函数131 。setdisk()设置当前驱动器的函数
函数132 。setgraphmode()将系统设置成图形模式并清屏的函数
函数133 。setlinestyle()设置当前画线宽度和类型的函数
函数134 。settextstyle()显示字符的当前设置函数
函数135 。setvect()设置中断向量函数
函数136 。setviewport()建立视口的函数
函数137 。setvisualpage()设置可见的图形页号的函数
函数138 。sin()
函数139 。sprintf()格式化输出到数组的函数
函数140 。strcat()
函数141 。tan()
函数142 。_write()写文件函数
函数143 。write()写文件函数
原文释义请到百度文库里搜寻字串“C语言常用函数”后下载
函数51-60因原注里排序号码少编,所以只有133个常用函数 。
DOC大小是119.5KB
贡献时间c语言优雅的接口函数:2010-09-10
贡献者c语言优雅的接口函数:handanlinzhang
关于c语言优雅的接口函数和c语言优雅的接口函数有哪些的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 网易云游戏海外服务器在哪,网易云音乐 海外
- 现在做直播要什么设备好,做直播需要些什么设备
- 性价比高的直播一体机电脑,便携式直播一体机
- c语言未调用函数怎么办 c语言函数调用常见错误
- 手机号申请企业标记怎么填,号码企业标记
- 零售店如何转电商营销,零售店如何转电商营销
- php数据库安全措施 php安全问题
- java代码结构图工具,java代码例子
- 退休后如何写新媒体文章,退休文章火了