我们在spatialite中有一些代码如下:
static int cmp_pt_coords (const void *p1, const void *p2)
{
....
}
static gaiaGeomCollPtr auxPolygNodes (gaiaGeomCollPtr geom)
{
....
/* sorting points by coords */
qsort (sorted, count, sizeof (gaiaPointPtr), cmp_pt_coords);
....
}
这显然是简化的 - 可以看到真正的代码 https://www.gaia-gis.it/fossil/libspatialite/artifact/fe1d6e12c2f98dff23f9df9372afc23f745b50df
我从gcc(gcc版本4.6.1(Ubuntu / Linaro 4.6.1-9ubuntu3))获得的错误是
/bin/bash ../../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I../.. -g -Wall -Werror -fprofile-arcs -ftest-coverage -g -I../../src/headers -fvisibility=hidden -g -Wall -Werror -fprofile-arcs -ftest-coverage -g -MT libsplite_la-spatialite.lo -MD -MP -MF .deps/libsplite_la-spatialite.Tpo -c -o libsplite_la-spatialite.lo `test -f 'spatialite.c' || echo './'`spatialite.c
libtool: compile: gcc -DHAVE_CONFIG_H -I. -I../.. -g -Wall -Werror -fprofile-arcs -ftest-coverage -g -I../../src/headers -fvisibility=hidden -g -Wall -Werror -fprofile-arcs -ftest-coverage -g -MT libsplite_la-spatialite.lo -MD -MP -MF .deps/libsplite_la-spatialite.Tpo -c spatialite.c -fPIC -DPIC -o .libs/libsplite_la-spatialite.o
spatialite.c: In function 'auxPolygNodes':
spatialite.c:17843:5: error: passing argument 4 of 'qsort' from incompatible pointer type [-Werror]
/usr/include/stdlib.h:761:13: note: expected '__compar_fn_t' but argument is of type 'int (*)(void *, void *)'
cc1: all warnings being treated as errors
我看了之前的一些帖子:
然而,它们看起来并不相同(或者至少,我在这些帖子中阅读建议的方式是我认为我们已经在这里做的)。
我可以使用:
来解决这个问题 qsort (sorted, count, sizeof (gaiaPointPtr), (__compar_fn_t)cmp_pt_coords);
但是我不明白为什么这是必要的,我担心其他系统的可移植性。似乎编译器在参数中省略了const-s。
答案 0 :(得分:4)
那个演员阵容非常好。 GCC不够聪明,不知道__compar_fn_t是
int (*)(const void *, const void *)
所以它会发出警告。
但是,__ compar_fn_t不可移植 - 所以如果你不想用它来进行转换,你应该让GCC不要使用适当的编译器标志来警告它。
或者您可以看到是否定义了__compar_fn_t
,如果没有定义,请自行定义:
#ifndef __GNUC__
typedef int (*__compar_fn_t)(const void *, const void *);
#endif
答案 1 :(得分:1)
错误可能来自您传递给编译器的可见性标志。您的意思是应该隐藏该编译单元中的所有功能。对于gcc,这会更改函数API,因此您的比较函数与qsort
所期望的函数不兼容。
您可能想要处理
#pragma visibility
或
__attribute__((__visibility(default)))
或类似的比较功能。
答案 2 :(得分:1)
警告/错误的原因是 __ compar_fn_t 的GCC原型是:
typedef int(* __ compar_fn_t)( __ const void *, __ const void );
而不是:
typedef int( __ compar_fn_t)( const void *, const void *);
因此,为了解决问题,只需将您的功能定义为:
static int cmp_pt_coords(__ constst void * p1,__ constst void * p2)