Jump to content

    
Sign in to follow this  
Neo_Matrix

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

Recommended Posts

Допустим есть 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)();

 

 

Edited by Neo_Matrix

Share this post


Link to post
Share on other sites
26 minutes ago, Neo_Matrix said:

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

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

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

 

Share this post


Link to post
Share on other sites
40 минут назад, Neo_Matrix сказал:

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

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

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

 

Share this post


Link to post
Share on other sites
21 минуту назад, Forger сказал:

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

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

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

Share this post


Link to post
Share on other sites

xvr, andrew_b

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

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

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

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

Share this post


Link to post
Share on other sites
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;

 

Share this post


Link to post
Share on other sites
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;
};

Сделал так.

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

Edited by Neo_Matrix

Share this post


Link to post
Share on other sites
32 минуты назад, Neo_Matrix сказал:

Сделал так.

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this