在C语言(ANSI,C99等)中,结构存在于自己的名称空间中。链表的结构可能看起来像这样:
struct my_buffer_type {
struct my_buffer_type * next;
struct my_buffer_type * prev;
void * data;
};
然而,对于大多数C程序员来说,自动对这些结构进行如下类型的定义似乎是很自然的:
typedef struct tag_buffer_type {
struct tag_buffer_type * next;
struct tag_buffer_type * prev;
void * data;
} my_buffer_type;
然后像普通类型一样引用该结构,即get_next_element(my_buffer_type * ptr)
。
现在我的问题是:是否有特定原因?
维基百科说http://en.wikipedia.org/wiki/Typedef#Usage_concerns
有些人反对typedef的广泛使用。大多数参数都以typedef仅隐藏变量的实际数据类型为中心。例如,Linux内核黑客和文档编制者Greg Kroah-Hartman阻止将它们用于除函数原型声明以外的任何内容。他认为这种做法不仅不必要地混淆了代码,而且还可能导致程序员意外地滥用大型结构,认为它们是简单的类型。[4]
其他人则认为,使用typedef可以使代码更易于维护。K&R指出使用typedef有两个原因。首先,它提供了使程序更具可移植性的方法。不必更改在程序源文件中出现的所有类型的类型,只需更改单个typedef语句即可。其次,typedef可以使复杂的声明更易于理解。
我个人想知道,使用单独的struct
命名空间是否有时没有使用类型定义的结构没有足够的好处,并且由于周围存在着几种C编程文化(我的经验是Windows C编程与Linux C编程有着不同的传统),如果还有其他我不了解的传统。
然后,我对历史考量(C的前身,第一个版本)感兴趣。
typedef
是隐藏变量的实际类型。以time_t
为例:如果人们去使用底层整数类型各地,在实现这样的变化是,将在2038需要将打破一个可怕的很多代码之一。people如果人们在使用结构时不了解原因,那是程序员的失败,而不是构造的失败。