структура x против x_t в C - PullRequest
       6

структура x против x_t в C

5 голосов
/ 08 декабря 2010

В моем недавнем классе операционных систем у нас есть куча объектов, определенных следующим образом:

typedef struct someobj {
  ... stuff ...
} someobj_t;

Я знаю, что это хорошо.

Вопрос в том, что иногда в данном коде поддержки структуры назывались struct someobj *some, а иногда someobj_t *some. Есть ли реальная / полезная причина ссылаться на структуры этими двумя различными способами, или это просто стилистическая разница?

Ответы [ 5 ]

6 голосов
/ 08 декабря 2010

Хотя от вас зависит, используете ли вы typedef или имя структуры, есть очень веская причина не использовать typedef имен, заканчивающихся на _t.Все такие имена зарезервированы POSIX для использования реализацией и могут относиться к типам реализации или могут быть стандартизированы в будущих версиях POSIX.К сожалению, многие авторы библиотек игнорируют это.

Лично я предпочитаю не использовать typedef для структур, но если вы решите использовать его, по крайней мере, избегайте зарезервированного пространства имен.

5 голосов
/ 08 декабря 2010

Предполагая, что мы спрашиваем о следующем коде (в вопросе на момент написания вопроса нет typedef, но я предполагаю, что он должен был быть там):

typedef struct someobj {
    // content
} someobj_t;

На самом деле обычно бывает достаточно опустить имя someobj и последовательно использовать someobj_t.Однако существует ситуация, когда вы хотите, чтобы структура ссылалась на себя:

typedef struct someobj {
    struct someobj* next;
    // cannot say someobj_t* yet - typedef not complete
} someobj_t;

// and from now on, both struct someobj and`someobj_t are equivalent
2 голосов
/ 08 декабря 2010

Предполагая, что вы имели в виду:

typedef struct someobj
{
    /* ... */
} someobj_t;

разница в целом просто стилистическая;некоторые люди предпочитают придерживаться "старого" стиля именования C для структур (где вы должны ставить ключевое слово struct каждый раз, когда вы ссылаетесь на этот тип), другие предпочитают более синтетический способ использования someobj_t.

Многие люди, которые используют символ, определенный typedef, чувствуют его более естественным, потому что часто они приходят из других языков (например, C ++, C #, ...), где нет необходимости в вещи struct,Во многих случаях они даже опускают имя struct в объявлении и просто оставляют имя typedef ed.

Использование этих двух символов в целом эквивалентно, но есть некоторые предостережения;Прежде всего, до конца typedef версия _t не существует, поэтому вы не можете объявить указатели на структуру внутри себя, используя имя _t.

Затем typedef «существует» только во время компиляции;это означает, что компилятор и отладчик будут ссылаться на ваш символ с не typedef ed именем.Если вы используете typedef без «реального» имени структуры, когда вам нужно исследовать ошибки с некоторыми компиляторами / отладчиками, вы можете сойти с ума, потому что вы не можете ссылаться на «настоящее» имя структуры, так как typedef ed структурыбез реального имени на самом деле анонимные структуры.

Это может стать особенно проблематичным, если вам придется экспортировать вашу структуру с помощью MIDL и тому подобного;см. этот пост Раймонда Чена для более подробной информации.

И последнее, но не менее важное: вы можете делать предварительные объявления только с реальным именем структуры;и если у вас нет имени структуры (но только typedef), вы не можете делать предварительные объявления.

2 голосов
/ 08 декабря 2010

Авторы могут не знать, что вы можете (или не предпочитаете) опускать someobj. Если вам нужен только один способ ссылки на тип, вы можете написать:

typedef struct {
  ...
} someobj_t;

Как упоминает Кос в другом ответе, это нормально, если структура не должна ссылаться на себя (например, в связанном списке). Для максимальной путаницы, вы всегда можете сделать:

typedef struct someobj_t {
  ...
} someobj_t;
1 голос
/ 08 декабря 2010

Я думаю, вы имеете в виду

typedef struct someobj {
 ... stuff ...
} someobj_t;

Это позволяет вам использовать someobj_ t в качестве типа вместо struct someobj.Обе записи эквивалентны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...