请点评下这种接口生命的优缺点(《C语言接口与实现》中的)

shiweifu 2012-04-07 06:15:35
刚上大学时候粗略看过一点,只觉得里面的数据结构实现的牛逼闪闪,拿里面的List_T写过一个Windows下的任务管理器就放那儿了。代码基本能看懂,但接口为啥写成那样就不知道了。

现在大学快毕业了,水平提高了一点,又翻到了,就求个甚解吧。。
里面的结构基本都是这样定义的:
.h文件:
#ifndef STUDENT_H#define STUDENT_H


#define T Student_T
typedef struct T *T;


#undef T
#endif



.c文件:
#include "student.h"


//定义
#define T Student_T
struct Student_T
{
int age;
char name[32];
};
//函数实现
T create_Student()
{
T s = NULL;
s = malloc(sizeof(*s));
s->age = 100;
strcpy(s->name,"wocao");
return s;
}


#endif

基本上每个结构体都是这样写的。
我认为优点是:

* 都是堆上分配
* 类型统一,不带*号
缺点:
* 乍一看乱七八糟,不容易懂
请大家点评下,看看我理解的对不对

(除了这本书中的这些源码,还没见过也写成这样的。。)



...全文
185 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
CyberLogix 2012-04-08
  • 打赏
  • 举报
回复
泛型很强大,现在JAVA都支持了,呵呵
缺媳妇的郝 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

我觉得楼主例子程序的风格,主要是为了实现“信息隐藏”。
没有要突出“泛型”的意思,很普通的一个数据结构和操作的封装。
[/Quote]
我也感觉和泛型没啥关系啊。还是学习了,的确不很清楚的。
飞天御剑流 2012-04-07
  • 打赏
  • 举报
回复
对了,这本书比较有意思的是那个用setjmp、longjmp和大量的宏实现的异常。
飞天御剑流 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
刚上大学时候粗略看过一点,只觉得里面的数据结构实现的牛逼闪闪,拿里面的List_T写过一个Windows下的任务管理器就放那儿了。代码基本能看懂,但接口为啥写成那样就不知道了。

现在大学快毕业了,水平提高了一点,又翻到了,就求个甚解吧。。
里面的结构基本都是这样定义的:
.h文件:
#ifndef STUDENT_H#define STUDENT_H


#define T St……
[/Quote]

根本目标是为了实现复用、健壮、可靠、可扩展,ADT是原始的信息隐藏和封装,由于不象C++那样有语言设施支持,只能写成这样了,因此ADT的内聚性是不及C++的类的。
ljhhh0123 2012-04-07
  • 打赏
  • 举报
回复
是经典的方法,有利于你用自己的数据结构来套入进行操作。
《数据结构与算法分析--C语言描述》里有类似的写法。
这样的写法属于C语言里顶级的写法了。有谁见过比这更漂亮更清晰,更健壮的C函数库吗?

作者曾给标准C委员会写了个参考编译器LCC,《可变目标C编译器设计与实现》一书有详细描述。源码中的那个CPP预处理器据说是Dennis Ritchie(C语言之父)写的。
northcan 2012-04-07
  • 打赏
  • 举报
回复
我觉得楼主例子程序的风格,主要是为了实现“信息隐藏”。
没有要突出“泛型”的意思,很普通的一个数据结构和操作的封装。
taodm 2012-04-07
  • 打赏
  • 举报
回复
你在C语言里折腾C++起才能支持的技巧,更闹不住。
不如逃去汇编吧,那边最清净。
northcan 2012-04-07
  • 打赏
  • 举报
回复
头文件中主要使用typedef struct T *T;
用指向T类型的指针,作为函数的参数和返回值等等。
这样做是为了实现“信息隐藏”。

因为Student_T在头文件中是一个“不完整类型”,
它的具体定义在.c源文件中:
struct Student_T
{
int age;
char name[32];
};
这样该封装的使用者(client),就只能通过.h头文件中的接口来操作Student_T。

而不允许使用者如下这样操作:
struct Student_T s;
s.age = 10;

没觉得这样的实现多么奇怪,我觉得这样的C模块程序风格非常常见。
shiweifu 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

直接上C++就得了。现在还扣这书的代码就是蛋痛了。
[/Quote]

从C++叛逃过来的。。
C++模板、泛型啥的实在闹不住啊!
Jim_King_2000 2012-04-07
  • 打赏
  • 举报
回复
写成这样都是为了灵活性。链表的元素即使换一种类型,对代码的改动也没有那么大。这可以说是用C实现的泛型。
taodm 2012-04-07
  • 打赏
  • 举报
回复
直接上C++就得了。现在还扣这书的代码就是蛋痛了。
slz17 2012-04-07
  • 打赏
  • 举报
回复
人还是很多的 但是点评接口。。。感觉自己也还没啥经验
个人感觉 C++的话是该加个友元类 管理 C的话就这么凑活吧
shiweifu 2012-04-07
  • 打赏
  • 举报
回复
果然是淡季。。木有人回帖。。
shiweifu 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

楼主从刚上大学到大学块毕业还不知道怎么在帖子中插入源代码……我该怎么吐槽……
[/Quote]

一共20多行,一眼就看完了。。再说这些也都是为了描述问题,木有加tag的必要吧
icemornings 2012-04-07
  • 打赏
  • 举报
回复
楼主从刚上大学到大学块毕业还不知道怎么在帖子中插入源代码……我该怎么吐槽……

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧