在我的代码中,我必须使用几个函数作为lambdas,例如您应该提供的 to qsort
。
因此,当我传递 type 的函数时int
,程序运行良好。但是当我还添加了另一个 type 函数时double
,出现了错误消息:
1.c:44:29:错误:二进制 < 的操作数无效(具有“双 *”和“双”)
从线:
return (*getter)(a) < target
getter
指针在哪里:
double get_sex(struct human* a) { // it's the second function I've passed
return a->sex;
}
我传递的两个函数之间的唯一区别是第一个是int
,第二个是double
。
sometype somefunction (some parameters,
int *comparator(struct human*, double, double *(struct human*)),
double *getter(struct human*) ) {
....
}
我开始检查它,sizeof
发现代码以某种方式(*getter)(*a)
返回 4 个字节而不是 8 个字节,所以它必须是指针而不是双精度。这就是我收到该错误消息的原因。
我去维基百科找了个例子,发现了额外的()
. 我已经添加了它们,现在它返回 8 个字节并且工作正常。
double (*getter)(struct human*) ) {
所以问题是:为什么我要在周围加括号getter
而不是在周围加括号comparator
?是函数返回double
而不是返回的原因int
吗?!
这是我从未听说过的语法细节。
(我使用在我的 Windows 上已经安装的编译器——来自 Perl 解释器 Strawberry)