LINUX.ORG.RU

Проблема курицы и яйца

 ,


0

1

Здравствуйте.

Подскажите, как быть. Объявляю типы-функции, принимающие первым аргументом структуру. И далее в этой структуре объявляю указатели на данные функции. Естественно, пишет «error: unknown type name 'clm_con'»

typedef bool (clm_close_func)(clm_con *clm);
typedef sds  (clm_send_func) (clm_con *clm, const char *cmd);

typedef struct {
  ...

  clm_send_func  send_func;
  clm_close_func close_func;
} clm_con;
★★★★★

typedef bool (clm_close_func)(struct clm_con_s *clm);
typedef sds  (clm_send_func) (struct clm_con_s *clm, const char *cmd);

typedef struct clm_con_s {
  ...

  clm_send_func  send_func;
  clm_close_func close_func;
} clm_con_t;
mittorn ★★★★★
()

Выше уже ответили. Добавлю, что с этой проблемой сталкиваются обычно в самом начале изучения «Структуры данных (на Си)» при реализации таких структур как стек, связный список.

gag ★★★★★
()

Можно ещё с forward declaration запилить.

...

struct clm_con;
typedef struct clm_con clm_con;

typedef bool (*clm_close_func)(clm_con *clm);
typedef sds (*clm_send_func)(clm_con *clm, const char *cmd);

struct clm_con {
  ...
  clm_send_func send_func;
  clm_close_func close_func;
};
theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Получается, указатель на структуру можно смело использовать еще до того как структура полностью объявлена?

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

Я не про это. А про функции члены структуры:

test.c:13:18: error: field ‘send_func’ declared as a function
   clm_send_func  send_func;
                  ^~~~~~~~~
test.c:14:18: error: field ‘close_func’ declared as a function
   clm_close_func close_func;
                  ^~~~~~~~~~

А должны были бы быть объявлены как указатели на функции:

typedef int (*clm_close_func)(struct clm_con_s *clm);
typedef int (*clm_send_func) (struct clm_con_s *clm, const char *cmd);
Кстати, theNamelessOne так уже и сделал.

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

Да, надо подучить си, всё руки не доходят. Хотел на днях взяться за Learn C The Hard Way, а автор его оказывается запроприетарил. И когда только успел. Пару месяцев нназад открыто на сайте всё лежало

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

Кстати да, кланг жалуется «field 'send_func' declared as a function»

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

да, forward declaraion. Как и в c++ указатели на класс.

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

Да, главное, чтобы где-нибудь было определение этой структуры.

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

Смотря что имеется в виду под «использовать». Объявлять переменные-указатели на incomplete type можно, присваивать им значения можно, а вот получать доступ к членам структуры через них нельзя.

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

Конечно, а в C++ это относится и к классам. Ты ж в итоге объявишь всё, так что это вполне допускается языком и очень полезно, и твой пример как раз это использует.

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