Перейти к содержанию
    

А вне Main, как автор хотел, слабо?

Яволь, пардон, ... спорол-с...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычно, так по привычке выходит... Чтобы, если что, внутри структуры можно было написать нечто вроде struct abc_s *next_item; и никто это не обругал.

 

Так а почему все-таки так нельзя делать?

 

Если просто выполнить typedef так:

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

то все работает.

 

Но мне для связного списка как раз нужно поле с указателем на следующий элемент:

typedef struct
{
    int a;
    char b;
    test_t *next;
} test_t;

вот так не работает, пиште "unknown type name". Но почему? Тип test_t ведь определен.

 

Приходится делать так:

typedef struct
{
    int a;
    char b;
    struct test_t *next;
} test_t;

 

А чтобы потом в коде еще можно было сделать так:

test_t *s_test;
s_test = s_test->next;

(ошибка "a value of type "test_t *" cannot be assigned to an entity of type "struct test_t *")

 

приходится добавлять test_t между идентификатором struct и фигурными скобками:

typedef struct test_t
{
    int a;
    char b;
    struct test_t *next;
} test_t;

Изменено пользователем ohmjke

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так а почему все-таки так нельзя делать?

 

Ответ на вопрос "почему" читать тут:

http://stackoverflow.com/questions/252780/...t-so-often-in-c

 

typedef struct S_Tag
{
   int a;
   int b;

   struct S_Tag* pNext;
} S ;

int _tmain(int argc, _TCHAR* argv[])
{
   S struct1;
   S struct2;

   struct2.pNext = &struct1;

   return 0;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но мне для связного списка как раз нужно поле с указателем на следующий элемент:

Проблема решается путём предварительного определения typedef, а потом самой структуры.

Это работает потому что при обработке typedef нет неоходимости знать деталей устройства структуры.

typedef struct test_t test_t;
struct test_t
{
    int a;
    char b;
    test_t *next;
};

Кстати, обратите внимание на то, что имя test_t используется и для имени структуры и как имя нового типа, в С можно так делать (хотя и нежелательно - вводит в заблуждение) потому что эти имена не конфликтуют - они принадлежат разным пространствам имён, а компилятор по контексту определяет что имеется в виду.

 

Но так дело обстоит в С, а в С++ всё сложнее и одновременно проще.

В С++ структура это тоже класс, то есть

struct s { ...

эквивалентно

class s { public: ...

и поэтому в предыдущем примере нет необходимости объявлять typedef, имя структуры уже является именем нового типа.

Но можно и оставить, тавтология с typedef допускается для совместимости с С. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...