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

Как сделать вложенные typedef структуру и указатель на функцию (С99)

Допустим есть typedef указатель на функцию, в качестве аргумента которой должна передаваться структура:

typedef result_e(*func_t)(config_t *arg);

И есть структура, которая содержит разные аргументы и указатели на функции func_t

typedef struct {
	uint8_t				error;
	uint8_t				some_param_1;
	uint8_t				some_param_2;
	func_t				f_now;
	func_t				f_next;
} config_t;

Разумеется вне зависимости в каком порядке их не разместить будет ошибка компиляции, так как компилятор не будет видеть или новый тип данных - функцию или структуру.

В С11 сделать такой финт просто - объявить анонимную структуру выше указателя на функцию, но как это провернуть в С99?

Приходит в голову только описать указатель на функцию с аргументом void и далее приводить типы, может есть другой подход?

Цитата

typedef result_e(*func_t)(void *arg);
//Или так без приведения типов....
typedef result_e(*func_t)();

 

 

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

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


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

26 minutes ago, Neo_Matrix said:

В С11 сделать такой финт просто - объявить анонимную структуру выше указателя на функцию, но как это провернуть в С99?

Сделать объявление config_t видимым всем, кто его использует.

Для этого достаточно разместить этот typedef в соотв. h-файле и инклудить этот файл в те C-файлы, где этот тип используется. 

 

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


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

34 минуты назад, Neo_Matrix сказал:

typedef result_e(*func_t)(config_t *arg);

typedef result_e (*func_t) (struct config_t *arg);

 

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


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

typedef result_e(*func_t)(struct config_t *arg);

typedef struct config_t {
	uint8_t				error;
	uint8_t				some_param_1;
	uint8_t				some_param_2;
	func_t				f_now;
	func_t				f_next;
} config_t;

 

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


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

40 минут назад, Neo_Matrix сказал:

В С11 сделать такой финт просто - объявить анонимную структуру выше указателя на функцию, но как это провернуть в С99?

Никаких C11 и иже с ними не нужно - всё что нужно было ещё в простом си: читайте мануал на тему "Неполное объявление типа". Пример:

struct Struct2;
struct Struct1 {
  Struct2 *p;
};
struct Struct2 {
  Struct1 *p;
};

 

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


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

21 минуту назад, Forger сказал:

Сделать объявление config_t видимым всем, кто его использует.

Для этого достаточно разместить этот typedef в соотв. h-файле и инклудить этот файл в те C-файлы, где этот тип используется.

Так не прокатит. typedef result_e(*func_t)(config_t *arg); будет вне области видимости, или я не допонял?

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


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

xvr, andrew_b

Так работает, но компилятор выдает ворнинги (113): warning: declaration of 'struct config_t' will not be visible outside of this function [-Wvisibility]

18 минут назад, jcxz сказал:

Никаких C11 и иже с ними не нужно - всё что нужно было ещё в простом си: читайте мануал на тему "Неполное объявление типа". Пример:

Спасибо, это то что нужно! Главное, про не полное объявление уже читал, но так и не использовал ранее :)

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


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

19 минут назад, jcxz сказал:

Никаких C11 и иже с ними не нужно - всё что нужно было ещё в простом си: читайте мануал на тему "Неполное объявление типа". Пример:

И правда работает, спасибо.

struct configg_t;
typedef  int(*func_t)(struct configg_t *);
typedef struct{
    uint8_t             error;
    uint8_t             some_param_1;
    uint8_t             some_param_2;
    func_t              f_now;
    func_t              f_next;
} configg_t;

 

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


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

typedef struct conf_t config_t;
typedef result_e(*func_t)(config_t *arg);

struct conf_t{
	uint8_t				error;
	uint8_t				some_param_1;
	uint8_t				some_param_2;
	func_t				f_now;
	func_t				f_next;
};

Сделал так.

Поправил до рабочего варианта.

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

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


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

32 минуты назад, Neo_Matrix сказал:

Сделал так.

А зачем все эти typedef struct conf_t config_t;? У Вас же си++. А Вы тянете наследие древнего си. В си++ можно выкинуть typedef и писать просто conf_t. Лишнее загромождение текста только...

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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