Есть такой код на C ( чисто учебный ):
Динамическая библиотека (libm.so) загружается с помощью функции dlopen,
Потом идёт функция dlsym:
cosine = dlsym( handle, “cos” );
Переменная cosine объявлена как double (*cosine)(double);
Если этот код включен в программу на C, то всё ОК, но если попытаться сделать что-нибудь подобное в C++, то gcc сразу выдаёт ошибку:
./math.cc:19: cannot convert `void *' to `double (*) (double)' in
assignment
Насколько я понимаю, C++ не может автоматически преобразовать указатель типа void в указатель на функцию. Как же в тогда его можно надурить ?
P.S. Если я что-нибудь неправильно понял или плохо объяснил, извините, т.к. программирую второй месяц.
Динамические библиотеки
Код: Выделить всё
typedef double (*pfn_cosin)(double);
void * hmodule = dlopen( path, RTLD_LAZY );
if ( hmodule )
{
pfn_cosin pfn = (pfn_cosin)dlsym( hmodule, "cosin" ); // get function pointer with valid type casting
if ( pfn )
(*pfn)(999); // call function
}
-
- Интересующийся
- Сообщения: 65
- Зарегистрирован: 19 авг 2003, 10:56
- Откуда: Anwerpen, Belgium / Belarus
- Контактная информация:
вот... и не надо никого дурить
в отличие от С, С++ имеет более строгую типизацию (что хорошо само по себе) и если нужно сделать какие-то преобразования - всегда можно сделать это явно, таким образом если что не так ( а это довольно часто бывает при преобразовании типов ) - то сам виноват и сам себе баклан
в отличие от С, С++ имеет более строгую типизацию (что хорошо само по себе) и если нужно сделать какие-то преобразования - всегда можно сделать это явно, таким образом если что не так ( а это довольно часто бывает при преобразовании типов ) - то сам виноват и сам себе баклан