LINUX.ORG.RU

Объявление


0

1

Подскажите

struct qqq_eee {
...
   struct ppp_eee *pe;
...
};

struct ppp_eee {
...
};

можно ли ставить указатель в первой структуре, на структуру, которая определена ниже?

да, это называется «неполный тип»

struct ppp_eee;
struct qqq_eee {
...
   struct ppp_eee *pe;
...
};

struct ppp_eee {
...
};

причём struct qqq_eee { может находится совсем в другом файле.

emulek
()
Ответ на: комментарий от anonymous

struct ppp_eee;

А это называется forward declaration.

можно подумать, я там что-то другое написал...

emulek
()
Ответ на: комментарий от x0r

Ну, вообще-то он и так известен и не зависит от того, куда указует. ;) Ударение было на поинтер, а он зависит только от архитектуры.

Таким образом конструкция вида:

struct first {
        struct second *p;
};

struct second {
        struct first *p;
};
являеется абсолютно легальной, даже без forward declaration, если я тут понятия не путаю.

beastie ★★★★★
()
Ответ на: комментарий от beastie

Я уже проверил. Хотел удалить, но ты уже ответил. Странно. У меня с подобной вещью были проблемы (я ниже ссылочку приводил).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от NeXTSTEP

Если мне память не изменяет, то в C не требуется предварительная декларация, а в крестах — требуется.

KblCb ★★★★★
()
Ответ на: комментарий от Eddy_Em

Проблемы будут, если написать

first_t *p;
т.к. first_t не определён, либо
struct first var;
т.к. размер var неизвестен.

Sorcerer ★★★★★
()
Ответ на: комментарий от Eddy_Em

Странно.

что тут странного? Указатель имеет всегда размер в sizeof(ptrdiff_t), а структура == объявление. Ошибка будет если ты попытаешься разименовать такой указатель до полного объявления.

emulek
()
Ответ на: комментарий от nanoolinux

А… Если перед указателем писать слово struct, то да. Если не писать, то нужно предварительное объявление.

KblCb ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.