Почему мы должны так часто определять структуру в C? - PullRequest
360 голосов
/ 31 октября 2008

Я видел много программ, состоящих из структур, подобных приведенной ниже

typedef struct 
{
    int i;
    char k;
} elem;

elem user;

Зачем это нужно так часто? Любая конкретная причина или область применения?

Ответы [ 15 ]

1 голос
/ 05 июля 2017

A> typdef помогает в значении и документировании программы, позволяя создавать более значимые синонимы для типов данных . Кроме того, они помогают параметризовать программу для решения проблем переносимости (K & R, pg147, C prog lang).

B> структура определяет тип . Structs позволяет удобно группировать коллекцию переменных для удобства обработки (K & R, pg127, C prog lang.) Как единое целое

C> typedef'ing структура объяснена выше A.

D> Для меня структуры - это пользовательские типы, контейнеры, коллекции, пространства имен или сложные типы, тогда как typdef - это просто средство для создания дополнительных псевдонимов.

1 голос
/ 30 января 2016

typedef не будет предоставлять взаимозависимый набор структур данных. Вы не можете сделать это с помощью typedef:

struct bar;
struct foo;

struct foo {
    struct bar *b;
};

struct bar {
    struct foo *f;
};

Конечно, вы всегда можете добавить:

typedef struct foo foo_t;
typedef struct bar bar_t;

В чем именно смысл этого?

0 голосов
/ 02 ноября 2016

Оказывается, в C99 typedef требуется. Он устарел, но многие инструменты (а-ля HackRank) используют c99 в качестве чистой реализации C И там требуется typedef.

Я не говорю, что они должны измениться (возможно, иметь два варианта C), если требование изменится, тем из нас, кто готовится к интервью на сайте, будет SOL.

0 голосов
/ 11 июня 2016

В языке программирования 'C' ключевое слово typedef используется для объявления нового имени некоторого объекта (struct, array, function..enum type). Например, я буду использовать struct-s. В «C» мы часто объявляем «struct» вне функции «main». Например:

struct complex{ int real_part, img_part }COMPLEX;

main(){

 struct KOMPLEKS number; // number type is now a struct type
 number.real_part = 3;
 number.img_part = -1;
 printf("Number: %d.%d i \n",number.real_part, number.img_part);

}

Каждый раз, когда я решу использовать тип структуры, мне понадобится это ключевое слово "struct" что-то "" имя ". Typedef будет просто переименовывать этот тип, и я могу использовать это новое имя в своей программе каждый раз, когда захочу. Таким образом, наш код будет:

typedef struct complex{int real_part, img_part; }COMPLEX;
//now COMPLEX is the new name for this structure and if I want to use it without
// a keyword like in the first example 'struct complex number'.

main(){

COMPLEX number; // number is now the same type as in the first example
number.real_part = 1;
number.img)part = 5;
printf("%d %d \n", number.real_part, number.img_part);

}

Если у вас есть какой-то локальный объект (структура, массив, ценный), который будет использоваться во всей вашей программе, вы можете просто дать ему имя, используя typedef.

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

Вообще говоря, в языке C struct / union / enum - это макроинструкция, обрабатываемая препроцессором языка C (не путайте с препроцессором, который обрабатывает "#include" и другие)

так:

struct a
{
   int i;
};

struct b
{
   struct a;
   int i;
   int j;
};

struct b расходуется примерно так:

struct b
{
    struct a
    {
        int i;
    };
    int i;
    int j;
}

и так, во время компиляции он развивается в стеке как-то так: б: Int Ai Int I int j

поэтому также трудно иметь самоссылающиеся структуры, цикл препроцессора C в цикле объявления, который не может завершиться.

typedef - это спецификатор типа, это означает, что его обрабатывает только компилятор C, и он может делать то, что хочет для оптимизации реализации кода на ассемблере. Он также не тратит член типа par тупо, как это делает препроцессор со структурами, но использует более сложный алгоритм построения ссылок, поэтому конструкция выглядит так:

typedef struct a A; //anticipated declaration for member declaration

typedef struct a //Implemented declaration
{
    A* b; // member declaration
}A;

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

Это означает, что в C typedefs ближе к классу C ++, чем к одиноким структурам.

...