Linux kernel 为什么结构化类型由struct标记而不是typename引用?

Linux kernel 为什么结构化类型由struct标记而不是typename引用?,linux-kernel,Linux Kernel,在Linux内核中,结构化类型的定义如下: typedef struct _TAG_ { ... }; struct _TAG_ structured_entity; struct _TAG_ *pointer_to_structured_entity; void function(struct _TAG_ *arg, ...); 然后在这样的例行程序中使用: typedef struct _TAG_ { ... }; struct _TAG_ structured_entity;

在Linux内核中,结构化类型的定义如下:

typedef struct _TAG_ { ... };
struct _TAG_ structured_entity;   
struct _TAG_ *pointer_to_structured_entity;
void function(struct _TAG_ *arg, ...);
然后在这样的例行程序中使用:

typedef struct _TAG_ { ... };
struct _TAG_ structured_entity;   
struct _TAG_ *pointer_to_structured_entity;
void function(struct _TAG_ *arg, ...);
为什么不呢

typedef struct _TAG_ { ... } _typename_; 
然后:

_typename_ structured_entity;   
_typename_ *pointer_to_structured_entity;
void function(_typename_ *arg, ...);
这样做的技术必要性是什么?或者这仅仅是传统/style/magic?

在kernel.org和内核附带的文档目录中,不鼓励对结构使用typedefs:

Chapter 5: Typedefs Please don't use things like "vps_t". It's a _mistake_ to use typedef for structures and pointers. When you see a vps_t a; in the source, what does it mean? In contrast, if it says struct virtual_container *a; you can actually tell what "a" is. 第5章:类型定义 请不要使用像“vps\u t”这样的东西。 对结构和指针使用typedef是一个错误。当你看到一个 副总裁; 在来源中,它意味着什么? 相反,如果它说 结构虚拟容器*a; 你实际上可以分辨出“a”是什么。 本文档接着列出了作者认为typedef有用的情况,例如只能使用访问器函数访问的不透明对象,最后总结为:

In general, a pointer, or a struct that has elements that can reasonably be directly accessed should _never_ be a typedef. 通常情况下,指针或结构包含可以合理使用的元素 可以直接访问,但决不能是typedef。
没有技术原因,typedef和struct标记是等效的。使用struct更显式,不会污染主命名空间。@是否确定“不会污染主命名空间”?是。结构标签位于一个单独的命名空间中(这对于C来说是正确的,C++没有这种怪癖,而TyPuff“技巧”不适用于此。一旦键入def,就会用结构名称“污染”主名称空间。因此,这是一个技术原因:-)谢谢。