我最近删除了一个类似的问题(对不起,如果有人在回答),我在这个比较函数中找到了跳过警告(迂腐标志)的解决方案:
int comp(const void *pa, const void *pb)
{
const int (*a)[2] = pa;
警告:
warning: initialization discards ‘const’ qualifier from pointer target type [enabled by default]
使用强制转换解决:
const int (*a)[2] = (void * const)pa;
完整代码:
#include <stdio.h>
#include <stdlib.h>
int comp(const void *pa, const void *pb)
{
const int (*a)[2] = (void * const)pa;
const int (*b)[2] = (void * const)pb;
return (a[0][0] + a[1][0]) - (b[0][0] + b[1][0]);
}
int main(void)
{
int a[][2][2] = {
{{1,2},{3,4}},
{{3,4},{5,6}},
{{2,3},{4,5}},
};
size_t i, n = sizeof(a) / sizeof(a[0]);
for (i = 0; i < n; i++) {
printf("%d\n", a[i][0][0] + a[i][1][0]);
}
qsort(a, n, sizeof(a[0]), comp);
printf("Sorted:\n");
for (i = 0; i < n; i++) {
printf("%d\n", a[i][0][0] + a[i][1][0]);
}
return 0;
}
现在它似乎在没有警告的情况下按预期工作,但我不明白演员阵容,为什么(void * const)pa
而不是(const void *)pa