Где и как поставить typedefed структуры? - PullRequest
3 голосов
/ 21 декабря 2011

У нас есть связанный список и некоторые структуры с определением типа:

struct _list_node {
    data_object *data;
    struct _temp_list_node *prev;
     struct _temp_list_node *next;
};
typedef struct _list_node list_node;

Должны ли мы поместить typedef в заголовок (включая struct _listnode? А затем включить его как в другие файлы И в LinkedList.c?

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Да, это то, что вы должны сделать: поместите typedef в заголовок вместе со структурой.Затем включите заголовок (через #include) во все файлы, которые используют структуру.Заголовки должны содержать объявления, в том числе и структуры.Декларации typedef в паре с этими структурами естественно вписываются туда, и часто от них ожидают, что кто-то смотрит на код.Если вы собираетесь использовать исключительно typedef, вы можете рассмотреть следующий синтаксис, который полностью исключает использование ключевого слова struct:

typedef struct {
    data_object *data;
    struct _temp_list_node *prev;
    struct _temp_list_node *next;
} list_node;

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

Как отдельное примечание, поскольку вы будете включать этот заголовок в несколько файлов, не забудьте использовать включить охрану .

2 голосов
/ 21 декабря 2011

Поместите его в заголовочный файл, если он является частью интерфейса модуля. Если другим модулям, вызывающим функции в LinkedList.c, нужны эти определения, поместите их в заголовок.

Если они используются только в LinkedList.c, держите их там закрытыми.

1 голос
/ 21 декабря 2011

обычно вы помещаете его в заголовок, если вам нужен доступ к нему вне связанного списка.

Хотя я склонен разрешать только функциям изменять структуру. Таким образом, связный список.c должен иметь все функции для работы с «list_node», и все эти функции должны быть объявлены в .h

...