ясность структуры typedef

#c #linked-list #typedef

#c #связанный список #typedef

Вопрос:

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

 struct stackNode
{
  int data;
  struct stackNode *nxtptr;
};

typedef struct stackNode StackNode;
typedef StackNode *StackNodePtr;
  

является

typedef struct stackNode StackNode; это то же самое, что struct stackNode StackNode и typedef StackNode *StackNodePtr; совпадает с struck stackNode *StackNodePtr ??

Ответ №1:

Если вы не хотите использовать typedef , вы всегда можете использовать полное имя типа:

Вместо:

 StackNode sn;
  

Вы бы использовали:

 struct stackNode sn;
  

Вместо:

 StackNodePtr snp;
  

Вы бы использовали:

 struct stackNode *snp;
  

Объявления точно такие же.

Комментарии:

1. soo typedef struct StackNode StackNode; будет ли struct StackNode StackNode структурой StackNode? и typedef StackNode *StackNodePtr; будет struct StackNode * StackNodePtr; я прав?

2. Помните: с помощью typedef вы только создаете / определяете / переименовываете новые типы , а не новые переменные.

3. @PabloSantaCruz вернее, новые имена типов.

Ответ №2:

Более распространенным способом написания того же самого было бы:

 typedef struct stackNode
{
  int data;
  struct stackNode *nxtptr;

} StackNode_t;
  

где stackNode — так называемый «тег структуры», а StackNode_t — фактическое имя типа. Если вы объявляете структуры подобным образом, остальной части программы не нужно будет обращаться к тегу struct, и вы можете использовать nxtptr, как если бы он был StackNode_t .

Ответ №3:

 typedef struct stackNode
{
  int data;
  struct stackNode *nxtptr;

} StackNode_t;
  

Если вы не хотите иметь «struct StackNode» внутри структуры, я обнаружил, что могу это сделать:

 typedef struct STACKNODE STACKNODE;
typedef struct STACKNODE
{
  int data;
  STACKNODE *nxtptr;
};
  

То, что вы могли бы закодировать такую вещь, И она просто отлично компилируется и работает просто отлично, может показаться нелогичным. Это может показаться нелогичным, потому что я использую одно и то же имя для struct STACKNODE и typedef STACKNODE. И, кроме того, я определяю структуру до того, как она будет существовать как определение. Тем не менее, я обнаружил, что могу сделать это с Microsoft C во многих версиях до сегодняшнего дня и Borland C (тогда еще).

Мне это нравится, потому что, если я уже собираюсь ввести структуру, мне не нравится прибегать к «struct STACKNODE * nxtptr» структуры (т. Е. использовать слово «struct») внутри определения структуры.

Комментарии:

1. Я думаю, что это в значительной степени два варианта, которые я нашел для использования typedef со связанным списком. 1

2. На самом деле вам не следует использовать a typedef без имени, поэтому второй оператор должен быть просто struct STACKNODE { … }; (опуская typedef ). В нынешнем виде у вас есть пустота typedef , и некоторые компиляторы предупредят об этом. Лично я бы не стал использовать все заглавные буквы для имени; я оставляю все заглавные буквы для макросов и констант перечисления.

Ответ №4:

С помощью typedef вы определяете, что StackNode должен быть struct StackNode, а указатель StackNodePtr должен быть StackNode.

Итак, что не ясно?

Ответ №5:

Ну, чтобы объяснить это легко: Typedef практически ничего не делает, кроме как сообщать компилятору, что вы создаете новый тип переменных (такой как int, char и т.д.)

Основными причинами использования typedef являются

  • Мнемонические имена. Это также часто используется в библиотечных функциях. Вместо использования стандартного типа, такого как int или long, вы можете просто ввести его в size_t. Так понятнее, для чего используется эта переменная.
  • Сокращение имен. Обычно используется для таких вещей, как структуры (это было бы в вашем случае). Чтобы избежать необходимости всегда вводить struct MyStruct varname, вы можете легко использовать typedef, чтобы избавиться от структуры впереди.

Ответ №6:

посмотрим, typedef поможет ли. Больше похоже на 101. Раздел, озаглавленный «Проблемы с использованием», может дать некоторое представление о ваших, э-э, проблемах.