Предполагая, что вы имели в виду:
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
), вы не можете делать предварительные объявления.