Почему часто tagName структуры отличается от имени typedef? - PullRequest
3 голосов
/ 01 марта 2010

Иногда я вижу такой код (надеюсь, я правильно его помню):

typedef struct st {
    int a; char b;
} *stp;

Хотя обычный шаблон, с которым я знаком, это:

typedef struct st {
    int a; char b;
} st;

Так в чем же преимущество в первом примере кода?

Ответы [ 5 ]

6 голосов
/ 01 марта 2010

Вы, вероятно, имеете в виду это:

typedef struct ST {
  /* fields omitted */
} *STP;

Звездочка в конце утверждения. Это просто означает «определить тип STP как указатель на структуру этого типа». Тег struct (ST) не нужен, он полезен только в том случае, если вы хотите иметь возможность ссылаться на тип структуры в дальнейшем.

Вы также можете иметь и то и другое:

typedef struct {
  /* fields omitted */
} ST, *STP;

Это позволило бы использовать ST для ссылки на сам тип структуры и STP для указателей на ST.

Лично я считаю очень плохой практикой включать звездочку в typedefs, поскольку она пытается кодировать что-то (факт, что тип является указателем) в имя типа, когда C уже предоставляет свой собственный механизм звездочка) чтобы показать это. Это делает его очень запутанным и нарушает симметрию звездочки, которая появляется как при объявлении , так и использовании указателей.

3 голосов
/ 01 марта 2010

Это привычка, вытекающая из того времени, когда имена typedef и struct tagnames находились в одном и том же пространстве имен. Смотри http://blogs.msdn.com/oldnewthing/archive/2008/03/26/8336829.aspx

2 голосов
/ 01 марта 2010

Я думаю, вы говорите:

typedef struct{
   int a;
   char b;
} object, *objectPointer;

Это означает, что (новый) тип objectPointer является указателем на struct (объект), определенный выше. Таким способом легко объявить указатели на объект struct. Например,

objectPointer A = (objectPointer)malloc(sizeof(object));
A->a = 2;

Теперь A - указатель на struct object, и вы можете обращаться к его переменным, как описано выше.

В случае, если objectPointer не был определен,

struct object *A = (struct object *)malloc(sizeof(object));
A->a = 2;
Так что, я думаю, objectPointer более удобен в использовании и
1 голос
/ 01 марта 2010

Я надеюсь, что первый код скажет об ошибке компилятора,

0 голосов
/ 01 марта 2010

Не вижу веской причины, по которой имя typedef отличается от имени тега.

Теперь причина, по которой имя тега нужно определить по типу, если вы не хотите использовать

struct tag v;

но

* +1007 *

вероятно исторический. Насколько я помню, C имел typedef, но я не знаю, было ли это так, когда было введено struct (обработка typedef - неприятность в грамматике C). В старом коде, который я видел, использование typedef для struct еще не сделано, и есть такие вещи, как unix

struct stat;
int stat(const char*, struct stat*);

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

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