Кто-то может объяснить, что это значит? void (* func) (); - PullRequest
3 голосов
/ 02 декабря 2011

У меня есть структура, в которой есть элемент, обозначенный как void (*func)(); Я знаю, что указатели void обычно используются для указателей на функции, но я не могу определить функцию. Я продолжаю получать dereferencing pointer to incomplete type. Я погуглил, но безрезультатно. Любой совет будет оценен.

Я пытаюсь сделать это:

struct callback * cb;
cb->func = *readUserInput;

ReadUserInput определяется как:

void readUserInput(void)
{
}

И Обратный вызов определяется так:

struct callback {
    void (*func)();
    int pcount;
    enum attr_type type;
    void *p[0];
 };

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

У вас три проблемы.

Ваш синтаксис при назначении указателя функции неверен, и вы фактически не определяете экземпляр обратного вызова struct.

Вы хотите сказать:

struct callback cb;
cb.func = readUserInput;

Вы могли бы явно взять адрес функции readUserInput, но это не нужно. Этот синтаксис будет выглядеть так:

struct callback cb;
cb.func = &readUserInput;

В стандарте C пустое имя функции будет оцениваться как адрес функции.

Наконец, ваш обратный вызов имеет неправильную подпись. Он определяется как функция, принимающая неизвестное количество аргументов и ничего не возвращающая.

Ваше объявление в структуре требует указатель на функцию, не принимающую аргументов и ничего не возвращающую.

Определить функцию обратного вызова как:

void readUserInput()
{

}

или исправьте объявление в структуре следующим образом:

struct callback {
    void (*func)(void);
    int pcount;
    enum attr_type type;
    void *p[0];
 };
2 голосов
/ 02 декабря 2011

Вам нужно взять адрес функции, а не пытаться разыменовать ее.

Изменение

cb->func = *readUserInput;

до

cb->func = &readUserInput;

Кроме того, вы создаете указатель со значением мусора, а затем разыменовываете его, вызывая неопределенное поведение. Вам нужно так или иначе выделить для него место (malloc/free или просто выделить его в стеке):

struct callback cb; // put it on the stack
cb.func = &readUserInput;

или

struct callback * cb = malloc(sizeof(callback));
cb->func = &readUserInput;

...

free(cb);
...