справочная страница из dlsym()
списки
*(void **) (&cosine) = dlsym(handle, "cos");
в качестве обходного пути для приведения возвращаемого значения dlsym()
,
Что значит *(void **) (&cosine)
Вот? я понимаю cosine
указатель функции, определенный ранее, но я не уверен, почему амперсанд &
нужен перед именем (ошибка без &
). Более того, я не понимаю, почему указатель void *
(void **
) снова используется с *
,
Давайте развернем его по очереди:
&cosine
Это берет указатель на переменную cosine
, так что это будет указатель на указатель на функцию.
(void **) &cosine
Мы приводим указатель на функцию-указатель на указатель на указатель на пустоту.
* (void **) &cosine
Разыменяем приведенный указатель, присваивая результат dlsym()
внутрь.
По сути, то, что происходит, является второстепенным вопросом. Вместо того, чтобы бросать результат dlsym()
в правильный тип указателя на функцию, мы притворяемся, что cosine
это void *
(через уровень косвенности) и назначить ему.
Других решений пока нет …