读书笔记--C语言接口与实现--接口与实现

本文详细解读了《C语言接口与实现》中关于接口封装的实例,包括接口定义、具体实现及抽象类型的运用。通过对接口的六个函数(如求最大值、最小值等)的阐述,探讨了如何设计合适的函数参数和返回值。同时,文中讨论了C语言中内建操作符在除法运算中的限制,并介绍了如何利用标准库函数div和ldiv确保正确计算。最后,通过栈的定义与实现,展示了C语言的抽象方式,并利用assert进行简单的错误检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口实现

重点内容在本书中的第二章中,介绍了接口的封装例子。

1. 接口定义

C语言中可将接口封装好,让后以.h文件作文扩展,简单例子:

extern int Arith_max(int x, int y);
extern int Arith_min(int x, int y);
extern int Arith_div(int x, int y);
extern int Arith_mod(int x, int y);
extern int Arith_ceiling(int x, int y);
extern int Arith_floor (int x, int y);

上述接口都在arith.h中声明。

以上6个函数都是对两个数的操作,求最大值,求最小值,除法,向上去整,向下取整。个人觉得对于定义接口的话,主要是找对最佳的函数参数,返回值,这一步比较简单。

2. 具体实现

这几个函数的实现比较简单,不过,作为一个接口封装的例子,比较好地诠释了一个过程。

int Arith_max(int x, int y)
{
      int max = 0;
      if(x >= y)
         max = x;
      else
         max = y;
      return 0;
 }

 int Arith_min(int x, int y)
 {
     int min = 0;
      if(x >= y)
        min = y;
      else
        min = x;
      return 0;
 }

对于除法来说,其中会涉及到内建的操作符;也可通过除法来做取余操作,不过,通过负数除正数,单纯地以内建除法来做,结果会向零舍入,比如:-13/5 = -2 结果如果以Int来算话。书中原话介绍。

The built-in operators are thus useful only for positive operands. The standard library functions div and ldiv take two integers or long integers and return the quotient and remainder in the quot and rem fields of a structure. Their semantics are well defined: they always truncatetoward zero, so div(-13, 5).quot is always equal to −2.
  int Arith_div(int x,int y)
  {
     if((-13/5)&&
        ((x<0)!=(y<0))&&
        (x%y != 0))
        return x/y - 1;
     else
        return x/y;
}
/*上面的条件(-13/5)得到判断内建除法 结果会得到-2,可以试试,但是用windows计算器计算-13/5会得到-3,这就是经过处理了。*/

int Arith_mod(int x, int y) {
     return x - y*Arith_div(x, y);
}

3. 抽象类型

在这个小节中,用C语言的抽象方式,来对一个栈进行定义与实现。根据自己的理解,对书中的代码有些许改动,更好地理解。

stack.h
#ifndef STACK_INCLUDED
#define STACK_INCLUDED
#define T Stack_T
typedef struct T *T;
extern T Stack_new(void);
extern int Stack_empty(T stk);
extern void Stack_push(T stk, void *x);
extern void *Stack_pop(T stk);
extern void Stack_free(T *stk);
#undef T
#endif
#include <stddef.h>
#include "assert.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;
    stk = malloc(sizeof(stk));
    stk->count = 0;
    stk->head = NULL;
    return stk;
}

void Stack_push(T stk, void *x) {
    struct elem *t;
    assert(stk);
    t = malloc(sizeof(struct elem));
    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->count > 0);
    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);
}

int Stack_empty(const struct T *stk) {
    assert(stk);
    return stk->count == 0;
}
main.c
#include"stack.h"
int main()
{
    Stack_T s;
    s = Stack_new();
    char x[] = "123";
    Stack_push(s,x);
    printf("%s\n", (char*)Stack_pop(s));
    Stack_push(s, x);
    if (Stack_empty(s) != 0)
        Stack_free(s);
    return 0;
}

对与其他高级语言存在现成的检测运行时错误,书中利用了assert断言的方式进行了错误的简单检测。

鉴于本人的水平,对文章中的知识点,请大家来指出,共同进步。

楼主选择的是下面的电子书

这里写图片描述

对于c语言接口网上的资料是少之又少,所以下面这些文字全是我一个字一个字打印上来的希望大家 能对的起我的付出: 现在的程序员都面临大量的关于应用程序接口(Application Programming Interface,API) 的信息,大多数人都会使用API和程序库,并在其所写的每一个应用程序中实现它们,但是很少人 会创建或发布新的能广泛应用的API,事实上,程序员似乎倾向循环使用他们自己的东西,而不 愿意查找,能满足他们要求的程序库,这或许是因为写特定应用程序代码要比查找设计好的API容易。 这里我所提到的是一种基于接口实现的设计方法,并且通过对24个接口及其实现的描述详细地演示了这种方法,这些接口涉及到计算机领域的很多知识,其中包括数据结构,算法,字符串处理 和并发程序,这些实现并不是简单的玩具----它们是为了在你们所设计的软件代码中使用而设计的。(当然了我会通过阅读量来看是否继续发下去,人要少了我就没有必要浪费时间了) c编程语言对基于接口设计方法的支持是极少的。 而面向对象的语言,如c++,Modula-3,则鼓励将接口实现分离,基于接口的设计独立任何特定 的语言,但是它要求程序员对像c一样的语言有更多的驾驭能力和更高的警惕性,因为这类语言很容易破坏带有隐含实现信息的接口,反之亦然。 然而一但掌握了基于接口的设计方法,就能够在服务于众多应用程序的通用接口基础上建立应用程序,从而加速开发,在一些c++环境中的基础类库就体现了这种效果。 增加对现有软件的重用---接口实现库,能够减少初始开发成本,同时还能减少维护成本,因为应用程序的更多部分都建立在经过良好测试的通用接口实现上,这里我提到的接口是针对数据结构的,但它并不是数据结构,我重点将放在算法引擎----包装数据结构以供应用程序使用----而不在数据结构算法本身,接口的示例和实现都以literate程序的方式给出,换句话说就是源代码及其解释是按照最适合理解代码的顺序交织出现的。 下面我将我想要给大家讲的内容分一下类: 基础 1,接口实现 2,异常断言 3,内寸管理 4,进一步内寸管理 数据结构 5,链表 6,表格 7,集合 8,动态数组 9,序列 10,环 11,位向量 字符串 12,原子 13,格式化 14,低级字符串 15,高级字符串 算法 16,扩展精度算法 17,任意精度算法 18,多精度算法 线程 19,线程 建议: 看到这里的朋友我相信对c语言都有了很长时间的学习 如果你还没有搞懂c语言的全部内容,我强烈建议你先别看这里
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值