2015-04-28 6 views
3

После прочтения какой-то источник из библиотеки GTK +, я столкнулся, что я воспринимаю быть довольно странным кусок кода:Какова точка соглашения _StructName в C?

typedef struct _GtkWidgetClass GtkWidgetClass; 

... 

struct _GtkWidgetClass 
{ 
    ... 
}; 

То, что я не понимаю в этом коде почему не написано, как это:

typedef struct 
{ 
    ... 
} GtkWidgetClass; 

Я чувствую, что я что-то не хватает ...
Если кто-то может просветить меня на том, почему GTK (или уж на то пошло, любой другой код) записывается таким образом, что это будет будем очень благодарны.

Заранее спасибо

+2

Есть указатели на 'GtkWidgetClass' внутри структуры? Если это так, они должны быть отредактированы в вопросе. – user3386109

+0

@ user3386109: Justs skimming через источник, похоже, что это не так (https://github.com/GNOME/gtk/blob/master/gtk/gtkwidget.h) – Levi

+2

[Руководство по стилю кодирования GNOME C] (https://developer.gnome.org/programming-guidelines/stable/c-coding-style.html.en) не говорит (это говорит о том, что 'typedef' должны на первом месте, но не почему они "нужны «чтобы быть разбитым), поэтому, я думаю, чтобы получить« реальный »ответ, нам нужен один из (оригинальных?) разработчиков GTK +, чтобы прослушивать. Не задерживая дыхание. – unwind

ответ

6

С строгой точки зрения кодирования, это не имеет никакого смысла. Однако в заголовочных файлах он может служить типом определения интерфейса, который отображает «общедоступный» интерфейс GTK +. Кстати, этот стиль следует за другими библиотеками GNU.

В любом случае, я могу с уверенностью сказать, что с современными компиляторами и инструментами C это не имеет особого смысла, но GTK + на самом деле не новая библиотека, поэтому она может содержать некоторые архаичные условные обозначения.

3

Первый случай позволяет использовать (typedefed) имя 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; 
+1

А теперь это немного лучше. Думаю, в том случае, когда я публиковал это, это была просто непрерывность (GtkWidgetClass не содержит экземпляров GtkWidgetClass). +1 – Levi