ViKo 1 8 февраля, 2015 Опубликовано 8 февраля, 2015 · Жалоба А вне Main, как автор хотел, слабо? Яволь, пардон, ... спорол-с... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ohmjke 0 2 апреля, 2015 Опубликовано 2 апреля, 2015 (изменено) · Жалоба Обычно, так по привычке выходит... Чтобы, если что, внутри структуры можно было написать нечто вроде 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; Изменено 2 апреля, 2015 пользователем ohmjke Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 2 апреля, 2015 Опубликовано 2 апреля, 2015 · Жалоба Так а почему все-таки так нельзя делать? Ответ на вопрос "почему" читать тут: 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 2 апреля, 2015 Опубликовано 2 апреля, 2015 · Жалоба Но мне для связного списка как раз нужно поле с указателем на следующий элемент: Проблема решается путём предварительного определения 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 допускается для совместимости с С. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться