使用typedef enum定义bool时,gcc 6.3.0中qsort报错问题咨询
问题根源与解决方案
首先,你的代码在MinGW GCC 6.3.0下报错的核心原因是**qsort的比较函数返回值类型不符合C标准要求**。
为什么VS能通过但GCC不行?
VS的编译器对非标准写法有一定的兼容宽松度,但GCC(包括MinGW版本)更严格遵循C标准。标准C中,qsort要求比较函数的返回类型必须是int,而不是你自定义的bool类型——bool的取值只有0和1,但qsort需要比较函数返回三类值:正数、0、负数,分别代表“前者排在前”“两者相等”“后者排在前”。
修复步骤
- 修改比较函数的返回类型:把
bool改成int - 调整返回值逻辑:根据你的降序需求返回对应整数:
- 当
vf1应该排在vf2前面时(降序即vf1的值更大),返回正数(比如1) - 当两者相等时返回0
- 当
vf1应该排在vf2后面时返回负数(比如-1)
- 当
修改后的示例代码
假设你的VF结构体有一个用于排序的字段(比如int value),调整后的比较函数如下:
// qsort比较函数,降序(符合标准的返回类型int) int cmp(const void *p1, const void *p2) { VF* vf1 = (VF*)p1; VF* vf2 = (VF*)p2; // 根据你的实际排序字段调整逻辑,这里以int类型的value为例 if (vf1->value > vf2->value) { return 1; // 降序:大的元素排前面 } else if (vf1->value < vf2->value) { return -1; } else { return 0; // 元素相等,顺序无关 } }
额外优化建议
你自定义的typedef enum{false,true} bool其实没必要——C99及以后的标准已经在<stdbool.h>头文件中定义了标准的bool、true、false,直接包含这个头文件就能使用标准布尔类型,避免自定义带来的潜在兼容性问题。
内容的提问来源于stack exchange,提问作者molamola
相关产品推荐
相关产品推荐

