C中的_StructName约定有什么意义?

C中的_StructName约定有什么意义?,c,gtk,conventions,C,Gtk,Conventions,在阅读了GTK+库中的一些源代码后,我遇到了一段我认为相当奇怪的代码: typedef struct _GtkWidgetClass GtkWidgetClass; ... struct _GtkWidgetClass { ... }; 我不明白这段代码为什么不是这样写的: typedef struct { ... } GtkWidgetClass; 我觉得我错过了什么… 如果有人能告诉我为什么GTK(或者其他代码)是以这种方式编写的,我将不胜感激 提前感谢从严格的编码角

在阅读了GTK+库中的一些源代码后,我遇到了一段我认为相当奇怪的代码:

typedef struct _GtkWidgetClass GtkWidgetClass;

...

struct _GtkWidgetClass
{
    ...
};
我不明白这段代码为什么不是这样写的:

typedef struct
{
    ...
} GtkWidgetClass;
我觉得我错过了什么…
如果有人能告诉我为什么GTK(或者其他代码)是以这种方式编写的,我将不胜感激


提前感谢

从严格的编码角度来看,它没有任何用途。但是,在头文件中,它可以作为接口定义的一种类型,列出GTK+的“公共”接口。顺便说一下,此样式遵循其他GNU库


无论如何,我想我们可以有把握地说,使用现代C编译器和工具,它没有太多意义,但GTK+并不是一个真正的新库,因此它可以包含一些古老的编码约定。

第一种情况允许您为成员使用
结构的(typedefed)名称:

typedef struct _node node;

struct _node
{
    int value;
    node *next; /* valid */
};


结构内部是否有指向
GtkWidgetClass
的指针?如果是这样,这些应该被编辑到问题中。@user3386109:只是浏览了一下源代码,似乎不是这样的。case()没有说(它确实说
typedef
s应该放在第一位,但不是为什么它们“需要”被分解),所以我想要得到一个“真正的”答案,我们需要一个(原始的?)GTK+开发人员加入进来。我没有屏住呼吸。@Levi好的,那么标准答案就不适用了。更改主题时,第一行不应该包含
struct
关键字吗?只需说“不要在同一声明中同时声明结构标记和变量或typedef,而是单独声明结构标记,然后使用它来声明变量或typedef”。这并不是GTK+正在做的事情。顺便说一句,我非常不喜欢没有动机的编码标准。啊,现在这更有意义了。我想在我发布的例子中,这只是一个连续性问题(GtkWidgetClass不包含GtkWidgetClass的实例)+1.
typedef struct
{
    int value;
    node *next; /* not valid (unknown type name ‘node’) */
} node;