Предупреждение о нечетном указателе функции в C - PullRequest
1 голос
/ 25 сентября 2010

ueach - это функция, которая перебирает строку Unicode и запускает обратный вызов для каждого символа, передавая ему односимвольную строку.

string ueach(string s, void *function(string)) {
    unsigned long i;
    for (i = 0; i < s.length; i++)
        function(uchar(s, i));
}

Если у меня есть обратный вызов testing:

void testing(string c) {
    puts(utoc(c));
}

, который печатает данный символ (utoc преобразует строку Unicode в UTF-8 char *), все работает нормально.Используемый код:

string a = ctou("Hello, world!");
ueach(a, &testing);

Однако я получаю это предупреждение:

test.c: In function ‘main’:
test.c:8: warning: passing argument 2 of ‘ueach’ from incompatible pointer type
ulib:171: note: expected ‘void * (*)(struct string)’ but argument is of type ‘void (*)(struct string)’

Если я поставлю скобки вокруг функциональной части прототипа ueach, как показано ниже:

string ueach(string s, void (*function)(string)) { ... }

, тогда он работает просто отлично, без предупреждения.

В чем разница между void * (*)(struct string) и void (*)(struct string)?

В чем разница между void *function(string)и void (*function)(string)?

Ответы [ 2 ]

4 голосов
/ 25 сентября 2010
  • void * (*)(struct string) - указатель на функцию, возвращающую void *.
  • void (*)(struct string) - указатель на функцию, возвращающую void.
  • void *function(string) - функция, возвращающая void *
  • void (*function)(string) - указатель на функцию, возвращающую void

Третий распад на первый, потому что:

"кроме случаев, когда это операнд размер оператора или одинарный & оператор, обозначение функции с тип 'функция, возвращающая тип' преобразован в выражение, которое имеет type 'указатель на функцию, возвращающую тип»."

C99 §6.3.2.1 / 4

3 голосов
/ 25 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...