В чем разница при использовании typdef при объявлении структуры?

Возможные дубликаты:
Почему мы должны так часто вводить структуру в C?
В чем разница между struct и typedef struct в C ++?

В чем разница между следующими объявлениями типов?

struct Person
{
    int age;
};


typedef struct 
{
    int age;
}Person;

Я это понимаю

struct 
{
    int age;
}Person;

Создает и экземпляр безымянной структуры с именем person, где

struct Person
{
    int age;
};

объявляет тип с именем person, но не экземпляр. Но я все еще не понимаю, что делает typedef.


person Anthony D    schedule 22.07.2009    source источник
comment
Похоже на дубликат stackoverflow.com/questions/612328/   -  person Laserallan    schedule 22.07.2009
comment
и как минимум полдюжины других вопросов.   -  person jalf    schedule 22.07.2009


Ответы (5)


Я думаю, что то же самое, что и в C, typedef создает псевдоним типа ... в вашем первом случае имя типа «struct Person», а во втором случае просто «Person».

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

typedef struct node {
    void *data;
    struct node *next;
} TNode, *PTNode;

Итак, теперь вы можете объявлять переменные одного типа следующими способами:

struct node *node1;
TNode *node2;
PTNode node3;

три приведенные выше переменные одинаковы, они указывают на структуру узла.

person fortran    schedule 22.07.2009
comment
Это было понимание, которое я получил со страницы википедии. - person Anthony D; 22.07.2009
comment
В C ++ (о чем и шла речь) это не то же самое, что в C. - person sbi; 22.07.2009
comment
@sbi Я не понимаю, чем он отличается от C к C ++ ... может быть, вы объясните нам это. - person fortran; 22.07.2009
comment
@fortran: Смотрите мой ответ. В C ++ struct X {} может называться X (а в C он должен называться struct X). Таким образом, в C ++ нет необходимости в typedef. За исключением случаев, когда вы пишете заголовки, которые также должны анализироваться компилятором C, это просто C-ism, который люди используют, не задумываясь (или не зная). - person sbi; 25.07.2009

В C структуры живут в собственном пространстве имен, поэтому вам нужно написать struct Person, если вы хотите использовать имя типа структуры. typedef устраняет необходимость в этом префиксе.

В C ++ структуры находятся в том же пространстве имен, что и все остальное, поэтому в этом нет необходимости. Обычно это воспринимается как ненужный C-ism.

person sbi    schedule 22.07.2009

c-совместимость практически такая же, как и в c ++, есть для устаревшего c-кода

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

person Community    schedule 22.07.2009

вы можете заметить разницу при передаче Person или struct Person в функцию

Если вы определили

struct Person { ... };

Вы должны передать его функции, явно заявляющей, что это структура

void foo(struct Person person) { ... }

С другой стороны, если вы определили

typedef struct Person { ... };

Вы не должны заявлять, что это структура, поскольку ключевое слово typedef позволяет вам фактически определять тип данных, в этом случае Person, и вы передаете его таким образом

void foo(Person person) { ... }

почти как любой другой тип данных

Надеюсь это поможет

person nairdaen    schedule 22.07.2009
comment
Ты имел ввиду typedef struct {...} Person; правильно? Во всяком случае, это так только в C, а не в C ++. - person sbi; 22.07.2009

В C ++ typedef являются синонимами для других типов, а не для отдельных типов. Обычно они используются для двух целей:

  • Создание переносимого кода, в котором вы абстрагируетесь от конкретной платформы. На одной платформе у вас может быть typedef int int32, а на другой платформе typedef long int32. Вы должны использовать int32 во всем своем коде, и при переносе на новую платформу вам нужно будет только изменить typedefs в соответствии с вашими требованиями.

  • Создание псевдонимов для очень сложных типов. Например. typedef char const* const* cppchar. Вместо того, чтобы писать в коде char const* const*, теперь вы можете написать cppchar.

person Martin Liversage    schedule 22.07.2009