C中的奇数函数指针警告

时间:2010-09-25 04:54:16

标签: c

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 个答案:

答案 0 :(得分:4)

  • void * (*)(struct string) - 指向返回void *的函数的指针。
  • void (*)(struct string) - 指向返回void的函数的指针。
  • void *function(string) - 函数返回void *
  • void (*function)(string) - 指向返回void
  • 的函数的指针

第三个衰退到第一个,因为:

  

“除非它是。的操作数   sizeof运算符或一元&   运算符,函数指示符   类型'函数返回类型'是   转换为具有的表达式   键入'返回函数的指针   类型”,“

C99§6.3.2.1/ 4

答案 1 :(得分:3)

这只是运营商优先权的问题。在错误的情况下,编译器将其解析为返回void *(返回某事物的指针)的函数,而不是指向返回void的函数的指针。