Mayor
Специалист
Offline
|
|
« : 26-09-2007 15:04 » |
|
gcc typedef: funct pointer
как создать тип указателя который будет ссылаться на функцию?
typedef void()(void) *pff;
как создать тип который будет содержать функцию принимающую указатель на аргумент этого типа?
typedef struct { void (*func)(ptoken pt,double *arg, double *expr ); union { double constant; int indifier; }; } token,*ptoken ;
|
|
|
Записан
|
1n c0de we trust
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 26-09-2007 18:25 » |
|
определяем тип указателя на функцию //typedef тип_функции (*имя_типа_указателя_на_функцию)(список_типов_арументов);
typedef void* (*pff)(void);
экземпляр указателя
|
|
« Последнее редактирование: 26-09-2007 18:27 от Алексей1153++ »
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #2 : 27-09-2007 04:59 » |
|
Mayor1, ИМХО BOOST::FUNCTION в связке с BOOST::BIND удобней.
|
|
|
Записан
|
Странно всё это....
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #3 : 27-09-2007 15:15 » |
|
определяем тип указателя на функцию //typedef тип_функции (*имя_типа_указателя_на_функцию)(список_типов_арументов);
typedef void* (*pff)(void);
экземпляр указателя typedef void(*pff)(void *, double *arg,double *expr); typedef struct { pff func; union { double constant; int indifier; }; } token,*ptoken ;
из за того что не могу заменить void* на ptoken - сыпется афигенное количество ворнингов, но отключать их тоже незя - а то опять 8 часов буду искать рантайм ошибку из за приведения типов либ буст вроде на С++ написана, мне еще полнедельки охота на чистом С попрограммить, без объектного подхода ...
|
|
|
Записан
|
1n c0de we trust
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 27-09-2007 16:59 » |
|
можно так //предопределение (забыл как называется) struct token;
//определение указателя на функцию typedef token*(*pff)(void *, double *arg,double *expr);
//определение структуры struct token { pff func; union { double constant; int indifier; }; };
//абсолютно бесполезное определение типа указатель на //(но раз тебе зачем то нужно - пажалста :) ) //typedef token* ptoken;
|
|
« Последнее редактирование: 27-09-2007 17:09 от Алексей1153++ »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #5 : 16-05-2008 05:18 » |
|
Я бы для лучшей усваиваемости использовал бы typedef для типа (именно это слово здесь ключевое) поинтера (а не это...), т.е. typedef void Function(); а потом можно и сам поинтер объяаить если надо Function * pFunction;
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #6 : 16-05-2008 05:43 » |
|
Я бы для лучшей усваиваемости использовал бы typedef для типа (именно это слово здесь ключевое) поинтера (а не это...), т.е. typedef void Function(); а потом можно и сам поинтер объяаить если надо Function * pFunction;
Твои слова бессмысленны, поскольку идентификатор функции и есть указатель на место в памяти, где находится код функции. #include <stdio.h>
typedef void(*pf)();
void f() { printf("Hello world\n"); }
int main() { pf p = f; p(); return 0; } Как видишь, идентификатор функции f без вопросов присваивается переменной p типа указатель на функцию pf. Потому, что у них одинаковые типы.
|
|
« Последнее редактирование: 16-05-2008 05:46 от dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #7 : 16-05-2008 07:21 » |
|
Не понял замечания, со всем сказанным тобой я согласен, не не понимаю как это относится к моему посту? Я лишь сказал, что моя запись удобнее для читабельности поскольку видно что объявляется поинтер (типа так же как и поинтер на int) не более того.
Это конечно дело привычки, но мне удобменее писать и читатть так Вот поинтер на int int * i; Вот поинтер на функцию Function * f;
Еще раз повторю никакой принциписальной (читай смысловой) разницы между твоим и моим кодом нет, разница только в написании (о чем я и написал в своем первом посте)
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #8 : 16-05-2008 16:17 » |
|
Ах для красоты... Можно макроизвращением сделать, "гасящим" ненужную звёздочку, но, боюсь, оно тебе сильно осложнит жизнь. Во всех остальных случаях аперсанд в определении типа для компилятора, совместимого с C++, будет означать ссылку (если это вообще будет синтаксически корректное выражение).
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #9 : 16-05-2008 21:49 » |
|
))) Опять мы в философию ударились ))) я лишь сказал как мне удобно, только так всегда и писал, если не нравится, дык я ж и не заставляю.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 17-05-2008 05:54 » |
|
lapulya, гораздо удобнее (и для тебя тоже ) просто запомнить, что имя функции - это есть указатель. Так же, как и имя массива. И путаться будет уже не нужно
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #11 : 17-05-2008 10:59 » |
|
Мне и запоминать не надо я это еще 10 - 12 лет назад уже прекрасно знал (в то время я еще писал, да не плохо, одна из работ это Flanker 2.5, LockOn и т.д.), я сказал что мне запись удобна (она схожа с записью объявления обычного поинтера) и я всегда так пишу
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 17-05-2008 14:39 » |
|
lapulya, понимаешь - хорошо, но тем более стрАнны твои тайпдефы Но раз тебе так удобнее...
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #13 : 17-05-2008 15:17 » |
|
Имхо, typedef-ы нужны только для задания именно конкретного типа функций, с определёнными параметрами и типом возврата. Да и хранить указатели на функции без информации, как их вызывать - не знаю, есть ли какой-то смысл
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #14 : 17-05-2008 20:17 » |
|
Не пойму в чем у вас проблема... ну вот есть у вас вопросы когда код такой typedef std::string String; String * str; или такой typedef std::string* String; String str; Я насколько понимаю нет...
А если так, я вот хоть убей не понимаю, что странного в этом typedef void Func(); Func * f; по отношению к этому typedef void (* Func)(); Funck f;
Смысла спорить балее на эту тему не наблюдаю, мне удобнее так как я предлагал (законно, правильно и для меня читабельнее), я ж не заставляю писать так всех, пусть каждый пишет как ему удобно. Вот Леша например легко без stl обходится и ему удобно (хотя я не понимаю как это возможно ))) ), ну бык и хорошо, пока он сам не почуйствует что оно ему надо он и не будет ее использовать потому как ему и так удобно!
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #15 : 17-05-2008 20:40 » |
|
Нередко бывает, что выпендрёж "мне удобно" лучше оставить и следовать "как принято" по той простой причине, что слаженной работы команды при выпендрёже каждого не достичь.
Но это так, лирика... индивидуалисты vs коллективисты.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #16 : 17-05-2008 20:47 » |
|
Согласен, но никто и никогда не жаловался (в то время когда я еще писал ))) ), вот только тут на форуме "терки" )))) начались.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 17-05-2008 21:15 » |
|
lapulya, никто и не будет жаловаться (разве что преемник по программе) , просто сам однажды запутаешься, где у тебя звёзд скрыт, а где нет. И полезешь переделывать тайпдефы и потеряешь с недельку времени лично я тайпдефы применяю от силы раза 2 в год, но вот так typedef std::string String; typedef std::string* String; я бы никогда не написал, и дело даже не в std::string а если бы и пришлось, то написал бы так typedef std::string td_String; typedef std::string* td_pString;
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #18 : 17-05-2008 22:21 » |
|
Я то не запутаюсь))) И в первую очередь потому что никогда не делаю typedef на указатель, я его делаю на тип объекта, а если нужен указатель на тип, так я и объявляю указатель на тип уже при объявлении переменной.
Пользуюсь typedef по нескольку раз в среднем в каждом втором классе (да еще и не один раз в одном и томже классе), ни разу не было проблем. Если использовать те инструменты, о которых написал товарищ Алесандресску, так их в каждом классе будет по 10 штук.
Ну а так td_String ябы не назвал потому, что у меня везде используется строка std::string (других не использую), так зачем мне префиксы td_ (да еще и с маленькой буквы, у меня все типы пишутся с большой, а это как раз тип)
|
|
« Последнее редактирование: 17-05-2008 22:23 от lapulya »
|
Записан
|
С уважением Lapulya
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #19 : 18-05-2008 06:58 » |
|
lapulya, к сожалению, этот благой подход к именованию типов входит в мощное противоречие с подходом в том же WinAPI, где практикуются префиксы в духе венгерской нотации, и объявляются типы указателей. А, главное, с этим ничего не сделать, если не писать свою собственную обёртку над WinAPI.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 18-05-2008 07:57 » |
|
lapulya, не бойся префиксов ))) И не важно, с какой буквы - "td_" - это всего лишь напомнит о том, что это typedef было определено, а "p" - это указатель
|
|
|
Записан
|
|
|
|
|