我为这个场景编写了一个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个编译器上正常工作。
1条答案
按热度按时间5t7ly7z51#
因为通过传递
-pedantic-errors
,您需要进行学究式的诊断,而且,* 学究式地,*const int[4]
不是常量限定类型(它是常量元素的数组,数组本身不能被限定)。gcc-5.1和更新版本在非学究模式下不发出此警告。