为什么gcc -Wdiscarded-qualifier抱怨此代码?

6tqwzwtp  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(222)

我为这个场景编写了一个qsort比较函数回调:

int matrix[3][4] = 
{
  {1,2,3,4},
  {5,6,7,8},
  {9,1,2,3},
};

qsort(matrix, 3, sizeof(int[4]), compare);

由于项目类型是int[4],那么qsort应该传递给我转换为const void*int(*)[4]指针。
所以我把函数写成这样:

int compare (const void* obj1, const void* obj2)
{
  const int (*ptr1)[4] = obj1;
  const int (*ptr2)[4] = obj2;
  /* ... */
  return 0;
}

gcc 12.2 x86 -Wall -Wextra -std=c17 -pedantic-errors抱怨const int (*ptr1)[4] = obj1;线路:
错误:初始化从指针目标类型中丢弃“const”限定符[-Wdiscarded-qualifiers]
为什么我会收到这个警告?据我所知,没有const限定符被丢弃。类型是一个指向4个const int数组的指针。显然,这个警告也可以追溯到旧的gcc版本。
而clang和icx使用相同的选项可以干净地编译相同的代码,并且最终结果可以在所有3个编译器上正常工作。

5t7ly7z5

5t7ly7z51#

因为通过传递-pedantic-errors,您需要进行学究式的诊断,而且,* 学究式地,* const int[4]不是常量限定类型(它是常量元素的数组,数组本身不能被限定)。
gcc-5.1和更新版本在非学究模式下不发出此警告。

相关问题