如何简化C语言qsort多字段优先级排序的compare比较函数
比较函数简化方案
核心思路是通过封装宏来消除重复的if判断逻辑,完全保留原有排序规则,简化后的实现如下:
前置修正
你原有代码缺少<string.h>头文件(用到了strncmp函数),先在代码头部引入:
#include <string.h>
简化后的比较函数代码
// 升序比较宏:a>b返回1,a<b返回-1,相等则继续执行后续逻辑 #define CMP_ASC(field) do { \ if ((*a1)->field > (*b1)->field) return 1; \ if ((*a1)->field < (*b1)->field) return -1; \ } while(0) // 降序比较宏:a>b返回-1,a<b返回1,相等则继续执行后续逻辑 #define CMP_DESC(field) do { \ if ((*a1)->field > (*b1)->field) return -1; \ if ((*a1)->field < (*b1)->field) return 1; \ } while(0) int compare (const void * a, const void * b) { struct test** a1 = (struct test**) a; struct test** b1 = (struct test**) b; CMP_ASC(experience); CMP_ASC(land); CMP_DESC(nest); CMP_ASC(shoe); // hat字符串字段单独处理(降序规则) int hat_cmp = strncmp((*b1)->hat, (*a1)->hat, MAX_HAT); if (hat_cmp != 0) return hat_cmp; CMP_ASC(boys); CMP_DESC(cake); CMP_DESC(price); CMP_DESC(bean); CMP_DESC(room); CMP_DESC(father); CMP_DESC(industry); CMP_DESC(foot); CMP_ASC(angle); CMP_ASC(kitty); CMP_ASC(attraction); CMP_DESC(thread); return 0; } // 取消宏定义避免污染全局命名空间 #undef CMP_ASC #undef CMP_DESC
说明
- 宏内使用
do{}while(0)是C语言多行宏的标准写法,可避免宏展开后出现语法错误 - 所有排序优先级、升降序规则和原有代码完全一致,无逻辑改动
- 代码长度大幅缩短,后续调整排序规则只需调整行顺序或替换升降序宏即可,维护成本更低
内容的提问来源于stack exchange,提问作者staypersistent
相关产品推荐
相关产品推荐

