2

我们在 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 version 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。

4

3 回答 3

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
于 2012-08-15T09:53:31.957 回答
1

该错误可能来自您传递给编译器的可见性标志。您是说该编译单元中的所有功能都应该隐藏。对于 gcc,这会更改函数 API,因此您的比较函数与qsort.

你可能想处理

#pragma visibility 

或者

__attribute__((__visibility(default)))

或类似的比较功能。

于 2012-08-15T10:17:38.973 回答
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 (__const void *p1, __const void *p2)

于 2014-06-18T08:21:09.343 回答