Neo_Matrix 0 12 марта, 2019 Опубликовано 12 марта, 2019 (изменено) · Жалоба Допустим есть 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)(); Изменено 12 марта, 2019 пользователем Neo_Matrix Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 12 марта, 2019 Опубликовано 12 марта, 2019 · Жалоба 26 minutes ago, Neo_Matrix said: В С11 сделать такой финт просто - объявить анонимную структуру выше указателя на функцию, но как это провернуть в С99? Сделать объявление config_t видимым всем, кто его использует. Для этого достаточно разместить этот typedef в соотв. h-файле и инклудить этот файл в те C-файлы, где этот тип используется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 12 марта, 2019 Опубликовано 12 марта, 2019 · Жалоба 34 минуты назад, Neo_Matrix сказал: typedef result_e(*func_t)(config_t *arg); typedef result_e (*func_t) (struct config_t *arg); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 12 марта, 2019 Опубликовано 12 марта, 2019 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 12 марта, 2019 Опубликовано 12 марта, 2019 · Жалоба 40 минут назад, Neo_Matrix сказал: В С11 сделать такой финт просто - объявить анонимную структуру выше указателя на функцию, но как это провернуть в С99? Никаких C11 и иже с ними не нужно - всё что нужно было ещё в простом си: читайте мануал на тему "Неполное объявление типа". Пример: struct Struct2; struct Struct1 { Struct2 *p; }; struct Struct2 { Struct1 *p; }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 12 марта, 2019 Опубликовано 12 марта, 2019 · Жалоба 21 минуту назад, Forger сказал: Сделать объявление config_t видимым всем, кто его использует. Для этого достаточно разместить этот typedef в соотв. h-файле и инклудить этот файл в те C-файлы, где этот тип используется. Так не прокатит. typedef result_e(*func_t)(config_t *arg); будет вне области видимости, или я не допонял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 12 марта, 2019 Опубликовано 12 марта, 2019 · Жалоба xvr, andrew_b Так работает, но компилятор выдает ворнинги (113): warning: declaration of 'struct config_t' will not be visible outside of this function [-Wvisibility] 18 минут назад, jcxz сказал: Никаких C11 и иже с ними не нужно - всё что нужно было ещё в простом си: читайте мануал на тему "Неполное объявление типа". Пример: Спасибо, это то что нужно! Главное, про не полное объявление уже читал, но так и не использовал ранее :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andreas1 1 12 марта, 2019 Опубликовано 12 марта, 2019 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 12 марта, 2019 Опубликовано 12 марта, 2019 (изменено) · Жалоба 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; }; Сделал так. Поправил до рабочего варианта. Изменено 12 марта, 2019 пользователем Neo_Matrix Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 12 марта, 2019 Опубликовано 12 марта, 2019 · Жалоба 32 минуты назад, Neo_Matrix сказал: Сделал так. А зачем все эти typedef struct conf_t config_t;? У Вас же си++. А Вы тянете наследие древнего си. В си++ можно выкинуть typedef и писать просто conf_t. Лишнее загромождение текста только... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 12 марта, 2019 Опубликовано 12 марта, 2019 · Жалоба В теме указал стандарт С99, не о каком С++ речь не идет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться