相反的评论说什么,这不是总是一个坏主意,typedef
的指针。有时您想要隐藏实现细节并通过句柄提供功能。在这些情况下,很常见的是所谓的opaque pointer类型。
例子:
在LinkedList.h
typedef void *LinkedList;
LinkedList LinkedList_Create();
void LinkedList_AddFirst(LinkedList list, void *element);
在LinkedList.c
struct linkedList {
/* head, tail, size, ... */
};
LinkedList LinkedList_Create() {
struct linkedList *plist = malloc(sizeof(struct linkedList));
/* error checking, initialization */
return plist;
}
void LinkedList_AddFirst(LinkedList list, void *element) {
struct linkedList *plist = (struct linkedList *) list;
/* your code here */
}
这种方法的缺点是,你需要明确地投指向你内部类型的d指针,但这不会重新由于C没有提供运行时类型检查,所以性能更差。
从最佳实践的角度来看,如果您不需要隐藏实施细节,通常最好不要typedef
指针。当然,这可能会让你的代码更加冗长,但这样你总是知道你正在处理的是什么类型。一般来说,typedef
不应该隐藏基础类型,而只需为其提供别名。
如果您有兴趣了解更多关于C最佳实践的知识,请参阅Linux内核的编码风格指南,您可以找到here。
是的,'typedef'指针几乎总是一个非常糟糕的想法.... –
你指的是选项1,'struct linkedlist'?为什么这是一个坏主意? –
这两种情况都有。 'tyedef'-ed类型不带指针符号,使后面的用法更不易读。 –