На первой строке (второй код вставки) объявляет указатель на функцию (я предполагаю, что вы знаете, что).
Теперь dlsym(3)
- это вызов, который возвращает void *
.
Так вторая линия также может быть прочитана как:
*((void **) (&fptr)) = dlsym(handle, "function");
В противном случае, сказал: вместо отливки результата функции, как int (*)(int)
, и влияющие на данный результат fptr; он накладывает указатель на fptr (или отправляет адрес fptr: указатель на указатель) как void**
. Затем он разыгрывает этот указатель, эффективно давая fptr (то же, что и исходный, но без типа int (*)(int)
), который затем получает результат вызова dlsym
. Это просто способ «обмануть» компилятор, чтобы не запускать предупреждения/ошибки о несоответствии типов. Также обратите внимание, что даже если выбранный вами синтаксис является вопросом вкуса, вы должны полностью понять, прежде чем использовать его в любой программе, которую вы выпустили.
Я надеюсь, что это помогает;)
Это то же самое, что и вторая строка второго кода кода OP ... –
@OliCharlesworth: No. –
Единственное отличие - дополнительные скобки, и они не имеют никакого эффекта. –