C语言中的接口是什么?它和抽象类有什么区别?把stdio.h库比喻成一个黑箱子,printf就是它的其中一个接口 。通过接口你可以使用箱子里的某个功能(在这里是输出字符)而不用去关心printf的实现,死钻stdio.h里的乱七八糟的原理 。
类(不是说抽象类)是C的东西,比如车类,由自身属性(颜色,重量什么的)和行为(前进,左转等)所构成,有点拟人的感觉 。你只能让车做行为而改变自己属性(前进撞墙了等)而不能直接改变它的属性(自动改变颜色?)还有其他什么继承就不罗嗦了 。
抽象类是类的其中一种特殊的类 。
C语言接口是什么意思?是指同一计算机不同功能层之间c语言函数的接口是什么的通信规则称为接口 。
java接口作用c语言函数的接口是什么:
1、利于代码的规范 。这样做的目的一方面是为c语言函数的接口是什么了给开发人员一个清晰的指示c语言函数的接口是什么,告诉c语言函数的接口是什么他们哪些业务需要实现;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率 。
2、有利于对代码进行维护 。可以一开始定义一个接口,把功能菜单放在接口里,然后定义类时实现这个接口,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性 。
3、保证代码的安全和严密 。一个好的程序一定符合高内聚低耦合的特征,能够让系统的功能较好地实现,而不涉及任何具体的实现细节 。这样就比较安全、严密一些,这一思想一般在软件开发中较为常见 。
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"
【c语言函数的接口是什么 c语言函数接口是什么意思】#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);
}
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语言函数的接口是什么和c语言函数接口是什么意思的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 显卡金手指没有了怎么办,显卡金手指在哪个位置
- 原神电脑使用羽毛按什么键,原神羽球怎么调角度
- mysql查询表两列内容相等,mysql查询表两列内容相等怎么办
- 无线路由器怎么装软件教程,无线路由如何安装
- linux编译执行命令 linux编译运行命令
- 图文直播间要注意什么安全,图文直播间要注意什么安全呢
- 六岁可以玩的益智游戏中班,6岁孩子玩的益智游戏
- 区块链对信用体系影响,区块链的信用从何而来
- oracle中怎么取月份 oracle 取年月日