определение структуры (не создание экземпляра) должно быть помещено в заголовочный файл? - PullRequest
1 голос
/ 14 июля 2011

У меня есть один файл .c и один .h.

Я не планирую иметь более одного файла .c.

Должен ли я поместить определение структуры в заголовочный файл?

Какая лучшая практика?

.h
typedef struct cow_s {
    int legs;
    char eyes;
} cow_t;

и

.c
cow_t *ptr_to_cow;

примечание: я не хочу, чтобы struct стала глобальной.

Ответы [ 3 ]

4 голосов
/ 14 июля 2011

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

2 голосов
/ 14 июля 2011

Это зависит от того, как вы собираетесь использовать структуру для своих пользователей. Если им разрешено создавать экземпляры и изменять элементы, то вам нужно поместить определение в заголовочный файл. С другой стороны, если пользователям не требуется доступ к элементам структуры, вы должны поместить его в файл .c.

Давайте предположим, что это последний случай. Если это так, cow_t непрозрачен для пользователей, и вам нужно будет создать для него функции доступа. Например:

cow_t *CreateCow( void )
{
  return malloc( cow_t );
}

void SacrificeCow( cow_t *cow )
{
  free( cow );
}

int GetNumberOfCowLegs( cow_t *cow )
{
  return cow->legs;
}

void SetNumberOfCowLegs( cow_t *cow, int numLegs )
{
  cow->legs = numLegs;
}
2 голосов
/ 14 июля 2011

Определение структуры принадлежит файлам .h (обычно). Если вы хотите скрыть структуру, поместите ее в файл .c, который будет ее использовать.

...