免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2001 | 回复: 9
打印 上一主题 下一主题

一个关于库设计时头文件的初级问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-29 11:06 |只看该作者 |倒序浏览
准备设计一个通用库,根据接口与实现分离的原则,将所有的库函数原型及外部变量的说明放在头文件中,调用者来进行包含。
在库的实现代码中一般包含该头文件吗?

举例说明,我们在调用strcpy函数时需要包含头文件string.h,但库的实现代码中需要包含此文件吗?

我的问题是一个设计方法的问题,我们一般所说的库的接口说明(头文件)只是针对调用者的吗?

论坛徽章:
0
2 [报告]
发表于 2005-07-29 12:02 |只看该作者

一个关于库设计时头文件的初级问题

自给就不能实验一下?
还有真得不太明白你问的什么

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-07-29 12:05 |只看该作者

一个关于库设计时头文件的初级问题

头文件是给你做 函数检查的.

#include <stdio.h>;

int main()
{
  exit(0);
}

可以编译通过。我没加stdlib.h头文件. 虽然可以通过但是如果加-Wall的话会给你警告.
实际上已经连接库了。库里有exit函数.

论坛徽章:
0
4 [报告]
发表于 2005-07-29 12:07 |只看该作者

一个关于库设计时头文件的初级问题

原帖由 "edarw" 发表:
准备设计一个通用库,根据接口与实现分离的原则,将所有的库函数原型及外部变量的说明放在头文件中,调用者来进行包含。
在库的实现代码中一般包含该头文件吗?

举例说明,我们在调用strcpy函数时需要包含头文件..........
一样要

论坛徽章:
0
5 [报告]
发表于 2005-07-29 12:19 |只看该作者

一个关于库设计时头文件的初级问题

微软对代码复用提出了二进制级复用和源代码复用两个层次.

你对接口和实现分离的理解有偏差.所谓接口和实现分离,应该指的是通过接口将一个组件的功能(对外的接口)暴露出来,隐藏其实现具体细节,从组件的外部来看,是无法知道组件内部的实现细节的,因此根本不可能使用全局变量,使得一个组件在二进制层次上保持一致性,你可以看看微软的COM组件规范里有哪一个组件内声明了全局变量的?!.如果对这方面感兴趣的话,推荐你看一下<<COM本质论>;>;和<<Inside COM>;>;,还有MSDN里面也有一些文章.

库的接口说明,不仅仅是针对调用者,同时也针对库的开发者.

你所讲的,应当属于代码级复用的范畴,你的库的实现代码中当然应当包含头文件,头文件的引入目的之一就是为了给调用者提供一个接口声明;对一个库而言,它的功能往往不是单一的,存在一些库函数,这些库函数中的一个函数有可能调用另一个函数,这就需要函数的声明,所以你应当包含它.而且,除非特别需要,不要使用全局变量.

论坛徽章:
0
6 [报告]
发表于 2005-07-29 12:25 |只看该作者

一个关于库设计时头文件的初级问题

实现没有问题,只是一个设计风格问题。
也就是说,在实现string库时,其源代码是否也包含了string.h头文件,还是说string.h只是给调用者用来包含的(进行符号说明)。请注意:我是在说库设计。

还是举个例吧,我的设计过程是这样的:
STEP 1
-----------------------------------
libtest.c
void fun1(void){
....
}
void fun2(void){
....
}
将libtest编译成动态共享库libtest.so
STEP 2
------------------------------
发布接口头文件
libtest.h
extern void fun1(void);
extern void fun2(void);

STEP 3
------------------------------
调用者书写程序
app.c
#include <libtest.h>;
void main(void)
{
fun1();
fun2();
}
编译app.c时 -ltest进去。

我没有必要在libtest.c中将libtest.h包含进去,当然写了也不会错。

请有过接口设计经验的TX回答一下。

论坛徽章:
0
7 [报告]
发表于 2005-07-29 12:31 |只看该作者

一个关于库设计时头文件的初级问题

谢谢renstone921,你理解了我的意思。

其实,用c++或者java等语言比较容易去理解这种思想,但是用c要麻烦一点,毕竟C只是一个函数和变量的概念,面向处理,不是面向对象(问题域)。
希望批评指正。

论坛徽章:
0
8 [报告]
发表于 2005-07-29 12:54 |只看该作者

一个关于库设计时头文件的初级问题

包含头文件,主要是为了进行参数类型匹配检查,以及一些全局变量的存在性的声明,你当然可以不包含它,但是如果包含它,编译器就会为你作更多的事情.因为C语言只是一个弱类型语言.这只是一个编程风格的问题.

的确,要想用C语言实现完全的接口与实现分离的话是比较困难,因为你必须使用C语言模仿类的构造函数,虚函数表的初始化,析构函数等功能,IUnknow接口的实现;但是库函数中,全局变量还是尽量不要用,因为你还要考虑多线程环境下,全局变量存取的影响.

实际上对于一个函数而言,主要应当强调的是高内聚性和低耦合性.

论坛徽章:
0
9 [报告]
发表于 2005-07-29 13:51 |只看该作者

一个关于库设计时头文件的初级问题

全局变量用得很少,即使用,我一般尽可能通过函数来存取,不直接进行操作。实际上是把“全局变量”(定义为static)封装在这个操作类中。

论坛徽章:
0
10 [报告]
发表于 2005-07-29 13:54 |只看该作者

一个关于库设计时头文件的初级问题

一般应该由调用者来包含。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP