2010-09-25 74 views
1

ueach是一个循环访问Unicode字符串并通过向每个字符传递单字符字符串来运行回调的函数。C中的奇函数指针警告

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)有什么区别?

回答

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

第三衰变到所述第一,因为:

“除了当它是 的操作数sizeof运算符或一元运算符, 类型的函数返回类型为' 转换为一个表达式,它具有 类型'指向返回 类型的函数的指针'。“

C99§6.3.2.1/ 4

3

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