Что означает "(datatype) (* ptrname) (datatype)"? - PullRequest
0 голосов
/ 09 марта 2019

1) В настоящее время я пытаюсь понять следующий код, но я не могу понять, что означает void (* func) (void), я могу понять, что пытаюсь сохранить адрес функции с именем "function"из list0513, в func указателя void, но что означает приведение (void) непосредственно перед знаком равенства?

// list0513.c
#include <dlfcn.h>
int main(void)
{       
    void *handle = dlopen("./list0513.so", RTLD_LAZY);
    void (*func)(void) = dlsym(handle, "function");
    (*func)();
    dlclose (handle);
    return 0;
}    

Согласно книге, функция с именем "function" вызывается из следующего скрипта

// list0513dl.c
#include <stdio.h>
void function(void)
{
    printf("Hello World\n");
}

2) но как мне сделать файл list0513.so?единственные файлы, которые я сделал, это .c файлы ... Спасибо, что прочитали это.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Декларация гласит:

       func           — func
      *func           — is a pointer to
     (*func)(    )    — a function taking
     (*func)(void)    — no parameters
void (*func)(void)    — returning void

Указатель func затем инициализируется результатом вызова dlsym, который возвращает адрес функции ”function ”в библиотеке list0513.so.

Общие правила объявления для типов указателей:

T *p;       // p is a pointer to T
T *p[N];    // p is an array of pointer to T
T (*p)[N];  // p is a pointer to an array of T
T *f();     // f is a function returning a pointer to T
T (*f)();   // f is a pointer to a function returning T

Как в объявлениях, так и в выражениях операторы постфикса [] subscript и () function имеют более высокий приоритет, чем унарный *, поэтому *f() анализируется как *(f()) (функция, возвращающая указатель). Чтобы объявить указатель на массив или функцию, * должен быть явно сгруппирован с декларатором массива или функции.

Объявления могут быть довольно сложными - вы можете иметь массив указателей на функции:

T (*a[N])(); // a is an array of pointers to functions returning T

или функции, возвращающие указатели на массивы:

T (*f())[N]; // f is a function returning a pointer to an array

или даже указатели на массивы указателей на функции, возвращающие указатели на массивы:

T (*(*(*a)[N])())[M];

Вы, вероятно, не увидите ничего такого, что волосатое в дикой природе, хотя (если вы не наткнетесь на мой старый код).

0 голосов
/ 09 марта 2019

Опущено объявление типа функции.Полная или расширенная версия должна выглядеть так:

// list0513.c
#include <dlfcn.h>
int main(void)
{       
    void *handle = dlopen("./list0513.so", RTLD_LAZY);
    typedef void(*FUNC)();
    FUNC func = dlsym(handle, "function");
    func();     // call function
    dlclose (handle);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...