1 模块化设计要求库接口隐藏实现细节
作为一个函数库来说,尽力减少和其调用方的耦合,是最基本的设计标准。C语言,作为经典“程序=数据结构+算法”的践行者,在实现函数库的时候,必然存在大量的结构体定义,接口函数需要对这些结构体进行操作。同时,程序设计的模块化要求库接口尽量少的暴露其实现细节,接口参数尽量使用基本数据类型,尽量避免在形参中暴露库内结构体的定义。
2 隐藏结构体的两种方法
以笔者粗浅的认识,有两种最常用的方法,可以实现库内结构体定义的隐藏:接口函数形参使用结构体指针,接口函数形参使用句柄。
2.1 通过结构体指针引用结构体
为了说明方便,先给出使用VC++写的一段例子代码。
库接口头文件 MySDK.h
#pragma once
#ifdef MYSDK_EXPORT
#define MYSDK_API __declspec(dllexport)
#else
#define MYSDK_API __declspec(dllimport)
#endif
typedef struct _Window Window; /*预先声明*/
#ifdef __cplusplus
extern "C" {
#endif
MYSDK_API Window* CreateWindow();
MYSDK_API void ShowWindow(Window* pWin);
#ifdef __cplusplus
}
#endif
库实现文件MySDK.c