C 中的 _StructName 约定有什么意义?
What is the point of the _StructName convention in C?
在阅读了 GTK+ 库的一些源代码后,我遇到了一段我认为相当奇怪的代码:
typedef struct _GtkWidgetClass GtkWidgetClass;
...
struct _GtkWidgetClass
{
...
};
我对这段代码不理解的是为什么它不是这样写的:
typedef struct
{
...
} GtkWidgetClass;
感觉好像少了什么...
如果有人可以告诉我为什么以这种方式编写 GTK(或任何其他代码),将不胜感激。
提前致谢
从严格的编码角度来看,它没有任何意义。但是,在头文件中它可以作为一种接口定义,其中列出了 GTK+ 的 "public" 接口。顺便说一下,这种风格遵循其他 GNU 库。
无论如何,我想我们可以有把握地说,对于现代 C 编译器和工具,它并没有多大意义,但 GTK+ 并不是一个真正的新库,因此它可以包含一些陈旧的编码约定。
第一种情况允许您为成员使用 struct
的(类型定义的)名称:
typedef struct _node node;
struct _node
{
int value;
node *next; /* valid */
};
typedef struct
{
int value;
node *next; /* not valid (unknown type name ‘node’) */
} node;
在阅读了 GTK+ 库的一些源代码后,我遇到了一段我认为相当奇怪的代码:
typedef struct _GtkWidgetClass GtkWidgetClass;
...
struct _GtkWidgetClass
{
...
};
我对这段代码不理解的是为什么它不是这样写的:
typedef struct
{
...
} GtkWidgetClass;
感觉好像少了什么...
如果有人可以告诉我为什么以这种方式编写 GTK(或任何其他代码),将不胜感激。
提前致谢
从严格的编码角度来看,它没有任何意义。但是,在头文件中它可以作为一种接口定义,其中列出了 GTK+ 的 "public" 接口。顺便说一下,这种风格遵循其他 GNU 库。
无论如何,我想我们可以有把握地说,对于现代 C 编译器和工具,它并没有多大意义,但 GTK+ 并不是一个真正的新库,因此它可以包含一些陈旧的编码约定。
第一种情况允许您为成员使用 struct
的(类型定义的)名称:
typedef struct _node node;
struct _node
{
int value;
node *next; /* valid */
};
typedef struct
{
int value;
node *next; /* not valid (unknown type name ‘node’) */
} node;