Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > приведение типа указателя на ф-ю


Автор: 040375 25.3.2008, 12:01
Раньше я не задумывался над этим вопросом - сейчас стало интересно. Например есть такой код:

int (*type_some_func)(int); 
type_some_func some_func;
.....
// Для более практичного примера возмём API вендовс - хотя сути вопроса это не касается
HANDLE h_dll=LoadLibrary("some_dll.dll");
......
// теперь получим какой либо адрес ф-ии с помощью GetProcAddress;
some_func=(type_some_func)GetProcAddress(h_dll, "some_func");

Подскажите, если можно приведите пример, как проделать тоже, что в вышеприведённом коде,
не пользуясь объявлением псевдонима типа с помощью typedef, т.е. к примеру
some_func=(int (*())); // компилятором здесь конечно же будет сгенерирована ошибка 
Как привести - чтобы не выдавалось ошибки компилятором и не пользуясь typedef???

Автор: korian 25.3.2008, 12:47
пишем:
Код

void foo(int a);
typedef void (*foo_func)(int);

void *a = foo;
foo_func b = a;

и компилятор сам скажет что писать  smile 
[C++ Error] Unit1.cpp(22): E2034 Cannot convert 'void *' to 'void (*)(int)'
пишем
foo_func b = (void (*)(int)) a;

Автор: archimed7592 25.3.2008, 14:11
040375, точно также, как ты можешь не указывать имена аргументов, ты можешь не указывать и имя результирующего типа(безымянный тип). Т.е. some_func = (int (*)(int))GetProcAddres(...);

Автор: GSasha 29.3.2008, 23:59
Цитата

 Т.е. some_func = (int (*)(int))GetProcAddres(...);

Все таки тяжеловато для восприятия smile 
В каком порядке эта конструкция разбираеться компилятором?

Автор: korian 30.3.2008, 00:17
сравните:
(int (*)(int))
int foo(int a);
можно сказать foo заменили на (*) и все.

Автор: GSasha 30.3.2008, 21:49
Понятно, Тоесть в любом случае тип указателя на функцию получаем таким способом так как имя функции и есть указатель на нее... Правильно korian?
Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)