Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc为qsort生成警告_C_Gcc_Qsort - Fatal编程技术网

gcc为qsort生成警告

gcc为qsort生成警告,c,gcc,qsort,C,Gcc,Qsort,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_p

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);
    ....
}
这显然是简化的-真正的代码可以在

我从gcc(gcc版本4.6.1(Ubuntu/Linaro 4.6.1-9ubuntu3))得到的错误是

我看了一些以前的帖子:

然而,它们看起来并不完全相同(或者至少,我阅读这些帖子中的建议的方式是我认为我们已经在做的事情)

我可以使用以下方法来解决此问题:

    qsort (sorted, count, sizeof (gaiaPointPtr), (__compar_fn_t)cmp_pt_coords);

然而,我不明白为什么这是必要的,我担心到其他系统的可移植性。编译器似乎从参数中省略了const-s。

该转换非常好。GCC不够聪明,不知道比较是什么

int (*)(const void *, const void *)
所以它发出了警告

但是,\uuuu compar\u fn\t是不可移植的——因此,如果您不想将其用于强制转换,您可能应该使用适当的编译器标志使GCC不会对此发出警告

或者,您可以查看是否定义了
\u compar\u fn\t
,如果未定义,请自行定义:

#ifndef __GNUC__
typedef int (*__compar_fn_t)(const void *, const void *);
#endif

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

你可能想处理这个问题

#pragma visibility 


或类似的比较函数。

出现警告/错误的原因是\uuuu compar\u fn\u t的GCC原型是:

typedef int(*比较fn_t)(uu常数无效*,u常数无效)
而不是:
typedef int(uu比较fn_t)(常量无效*,常量无效*)

因此,为了解决这个问题,只需将函数定义为:

静态int-cmp\u-pt\u坐标(\uuu-const-void*p1,\uu-const-void*p2)

正常,尽管它看起来很难看。真正令人担忧的是它是否会在任何地方起作用。我需要使用一些预处理器宏魔术才能在其他编译器上工作吗?但是
\uu compar\u fn\t
应该有const限定参数,所以gcc应该是wrong@BradHards是的,更正了。这是特定于glibc的AFAIK。为什么你不能不使用-Werr?我想使用-Werror来确保在所有输出都在屏幕上运行时,编译器不会告诉我任何(真实的)错误。@BradHards我看到了-然后看到我更新的答案,肯定有一个编译器标志来关闭函数指针类型不匹配。你是对的,这是可疑的。您的比较函数显然具有正确的原型。我怀疑您的一些命令行参数会使gcc隐式地更改
静态
函数的原型<例如,code>-fvisibility=hidden可以添加一些属性。这是一个有趣的想法,但去掉可见性标志并不会改变错误。我也尝试了属性方法,也没有改变。所以我会进一步深入研究gcc选项,我只是尝试了一点,在这里,只有标准编译选项,我的gcc可以很好地解决这些问题。
#pragma visibility 
__attribute__((__visibility(default)))