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)
之间的区别是什么?
答案 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的函数的指针。