《C语言接口与实现:创建可重用软件的技术》一2.2 实现

简介:

本节书摘来自异步社区《C语言接口与实现:创建可重用软件的技术》一书中的第2章,第2.2节,作者 傅道坤,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.2 实现

实现会导出接口。它定义了必要的变量和函数,以提供接口规定的功能。实现具体解释了接口的语义,并给出其表示细节和算法,但在理想情况下,客户程序从来都不需要看到这些细节。不同的客户程序可以共享实现的目标码,通常是从(动态)库加载实现的目标码。

一个接口可以有多个实现。只要实现遵循接口的规定,完全可以在不影响客户程序的情况下改变实现。例如,不同的实现可能会提供更好的性能。设计完善的接口会避免对特定机器的依赖,但也可能强制实现依赖于机器,因此对用到接口的每种机器,可能都需要一个不同的实现(也可能是实现的一部分)来支持。

在C语言中,一个实现通过一个或多个.c文件来提供。实现必须提供其导出的接口规定的功能。实现会包含接口的.h文件,以确保其定义与接口的声明一致。但除此之外,C语言中没有其他语言机制来检查实现与接口是否符合。

如同本书中的接口,本书描述的实现也具有一种风格化的格式,如arith.c所示:

〈arith.c〉≡ 
 #include "arith.h" 
 〈arith.c  functions 14〉 

〈arith.c functions  14〉≡ 
 int Arith_max(int x, int y) {
   return x > y ? x : y;
 } 

 int Arith_min(int x, int y) {
   return x > y ? y : x;
 }

除了〈arith.c functions 14〉,更复杂的实现可能包含名为〈data〉、〈types〉、〈macros〉、〈prototypes〉等的代码块。在不会造成混淆时,代码块中的文件名(如arith.c)将略去。

在Arith_div的参数符号不同时,它必须处理除法的两种可能行为。如果除法向零舍入,而y不能整除x,那么Arith_div(x,y)的结果为x/y - 1,否则,返回x/y即可:

〈arith.c _functions _14_〉+≡ 
int Arith_div(int x, int y) { 
  if (〈division truncates toward 0 14〉
  && 〈x and y have different signs 14〉 && x%y != 0) 
    return x/y - 1; 
  else 
    return x/y; 
}

前一节的例子,即将-13除以5,可以测试除法所采用的舍入方式。首先判断x和y是否小于0,然后比较两个判断结果是否相等,即可检查符号问题:

〈division truncates toward 0 14〉≡ 
 -13/5 == -2 

〈x and y have different signs  14〉≡ 
 (x < 0) != (y < 0)

Arith_mod可以按其定义实现:

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

如果Arith_mod也像Arith_div那样进行判断,那么也可以使用%运算符实现。在相应的条件为真时,

Arith_mod(x,y) = x - y*Arith_div(x, y)
        = x - y*(x/y - 1)
        = x - y*(x/y) + y

加下划线的子表达式是标准C对x%y的定义,因此Arith_mod可定义为:

〈arith.c functions 14〉+≡ 
 int Arith_mod(int x, int y) { 
   if (〈division truncates toward 0 14〉
   && 〈x and y have different signs 14〉 && x%y != 0) 
     return x%y + y; 
   else 
     return x%y; 
}

Arith_floor刚好等于Arith_div,而Arith_ceiling等于Arith_div加1,除非y能整除x:

〈arith.c functions 14〉+≡
 int Arith_floor(int x, int y) { 
  return Arith_div(x, y); 
 } 

 int Arith_ceiling(int x, int y) {
  return Arith_div(x, y) + (x%y != 0); 
}
相关文章
|
3月前
|
传感器 IDE 编译器
C语言与硬件接口
C语言与硬件接口
69 0
|
5月前
|
存储 移动开发 C语言
技术心得记录:嵌入式开发中常用到的C语言库函数
技术心得记录:嵌入式开发中常用到的C语言库函数
52 1
|
5月前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
64 7
|
5月前
|
SQL 数据库 C语言
【sqlite的C语言访问接口】执行SQL语句的接口------sqlite3_exec回调函数的使用
【sqlite的C语言访问接口】执行SQL语句的接口------sqlite3_exec回调函数的使用
|
6月前
|
程序员 C语言
C语言中的流程转移控制技术
C语言中的流程转移控制技术
54 2
|
6月前
|
存储 缓存 算法
动态数组技术详解及其在C语言中的应用
动态数组技术详解及其在C语言中的应用
82 0
|
6月前
|
C语言
C语言中的字符串处理函数技术详解
C语言中的字符串处理函数技术详解
78 1
|
6月前
|
算法 搜索推荐 数据处理
C语言中的排序与查找技术详解
C语言中的排序与查找技术详解
64 1
|
6月前
|
存储 C语言
向函数传递字符串: C语言中的技术与实践
向函数传递字符串: C语言中的技术与实践
373 0
|
6月前
|
存储 算法 C语言
探索C语言中的动态数组技术
探索C语言中的动态数组技术
70 0