char **av;
SIZE_T ac;
char WordCopy[256] = {0};
av[ac] = strdup(p);
qsort(av, ac, sizeof (char *), compare);
STATIC int compare(const void *p1, const void *p2)
{
const char *pp1 = *(const char **)p1;
const char *pp2 = *(const char **)p2;
return strcmp(pp1, pp2);
}但是,它给了我以下错误:
complete.c: In function ‘compare’:
complete.c:26:24: error: cast discards ‘__attribute__((const))’ qualifier from pointer target type [-Werror=cast-qual]
const char *pp1 = *(const char **)p1;
^
complete.c:27:24: error: cast discards ‘__attribute__((const))’ qualifier from pointer target type [-Werror=cast-qual]
const char *pp2 = *(const char **)p2;
^它的旧写法是这样的:
STATIC int
compare(p1, p2)
CONST char **p1;
CONST char **p2;
{
return strcmp(*p1, *p2);
}我不明白有什么区别..。为什么我搞错了选角?我在这里发现了其他一些类似的问题,这似乎表明我使用的语法应该有效.但显然并非如此。
我宁愿“正确地”这样做,而不仅仅是禁用警告(禁用警告不会通过代码评审)。
编辑:用户chux问如果我设置一个新的var..。结果如下:
const char **s1 = (const char **)p1;生产:
complete.c: In function ‘compare’:
complete.c:26:23: error: cast discards ‘__attribute__((const))’ qualifier from pointer target type [-Werror=cast-qual]
const char **s1 = (const char **)p1;
^发布于 2018-04-09 19:31:54
解决方案不需要任何铸造。
分配const void *的示例
const void *p1 = NULL;
char *q1 = p1; // warning: initialization discards 'const' qualifier from pointer target type
const char *q2 = p1;
const char **q3 = p1; // warning: initialization discards 'const' qualifier from pointer target type
const char * const *q4 = p1;
char * const *q5 = p1;const void *p1指向const数据。赋值目标类型还需要指向const数据的类型。上面的q1和q3没有指向const数据。任何一个q4,q5都适用于OP的比较。
int compare5(const void *p1, const void *p2) {
char * const *pp1 = p1;
char * const *pp2 = p2;
return strcmp(*pp1, *pp2);
}发布于 2018-04-09 19:17:22
您还需要创建指向const的指针:
const char *pp1 = *(const char * const *)p1;
const char *pp2 = *(const char * const *)p2;https://stackoverflow.com/questions/49739672
复制相似问题