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 バージョン 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

警告/エラーの理由は、__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 に答える
1

エラーはおそらく、コンパイラに渡す可視性フラグが原因です。そのコンパイル単位のすべての関数を非表示にする必要があると言っています。gcc の場合、これにより関数 API が変更されるため、比較関数は が期待するものと互換性がなくなりますqsort

あなたは対処したいかもしれません

#pragma visibility 

また

__attribute__((__visibility(default)))

または比較関数についても同様です。

于 2012-08-15T10:17:38.973 に答える