Подтвердить что ты не робот

C typedef указателя на структуру

Я встретил следующий код:

typedef struct {
        double x;
        double y;
        double z;
} *vector;

Является ли это допустимым определением типа? Код компилируется и работает отлично. Мне было просто любопытно, если это обычная практика.

4b9b3361

Ответ 1

Абсолютно допустимо. Обычно вы можете в полной мере воспользоваться этим путем, объединив два типа:

typedef struct
{
 int a;
 int b;
} S1, *S1PTR;

Где S1 является структурой и S1PTR является указателем на эту структуру.

Ответ 2

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

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

int do_fancy(vector a, vector b); 

или

int do_fancy(vector *a, vector *b);

в первом случае я могу легко пропустить, что эта функция может изменить содержимое a или b. Во втором я предупрежден.

А когда на самом деле писать код, я также знаю непосредственно писать a->x и не компилятор сказать мне error: request for member x 'в чем-то не структуре или объединении`.

Я знаю, это похоже на личную вещь вкуса, но, работая с большим количеством внешнего кода, я могу заверить вас, что это очень раздражает, когда вы не узнаете уровень переменных в пространстве. Это одна из причин, по которой мне также не нравятся ссылки на С++  (в Java это не потому, что все объекты передаются по ссылке, они согласованы) и Microsoft LPCSTR типы типов.

Ответ 3

Да, это действительно так. Если вам нужна дополнительная "безопасность", вы также можете сделать

typedef struct vector_{
        double x;
        double y;
        double z;
} *vector;

то вы можете использовать оба

struct vector_ *var;
vector var;

Но не забывайте о концевой запятой.

Использование только typedef означает, что вы так называете его. в противном случае это было бы более или менее анонимным.

Ответ 4

Это действительный, то, что он делает, определяет новый тип. Как сказал @Alex, было бы полезно определить тип и тип указателя.

Вы можете создать больше указателей, используя

S1PTR ptr1, ptr2, ptr3, ...;  

вместо

S1 *ptr1, *ptr2, *ptr3, ...;

Ответ 5

Да, это действительно так, как описано в приведенных выше ответах. Небольшое предложение, было бы лучше, если бы вы указали название тега, как показано ниже. Это поможет некоторым IDE лучше разобрать ваш код.

typedef struct vactor_tag {
        double x;
        double y;
        double z;
} *vector;

Ответ 6

да... избавляет вас от необходимости постоянно печатать слово "struct" каждый раз, когда вы объявляете векторную структуру или указатель на нее.