假设我有以下结构:
struct Person
{
int age;
int weight;
int height;
};
我想用一个";通用的";compare函数,它将获取结构体person的两个实例,然后通过比较两个特定字段来进行比较。
假设我的比较函数是这样的:
int compare(void *first_data, void *second_data, void *param)
{
if (first_data->param > second_data->param)
{
return -1;
}
if (first_data->param < second_data->param)
{
return 1;
}
return 0;
}
而void *first_data
将表示结构Person的第一个实例,void *second_Data
将表示结构Person的第二个实例,而void *param
将以某种方式指示函数,根据哪个字段来比较结构。目前我不知道如何使用这个";void*param";为此目的。例如,我如何通过";重量;领域
传入所需成员的偏移量,而不是param
。由于所有成员都是int
,因此可以进行共同比较。
#include <stddef.h>
int Person_compare(const struct Person *first_data,
const struct Person *second_data, size_t param_offset) {
int first = *(int *)((char *)first_data + param_offset);
int second = *(int *)((char *)second_data + param_offset);
return (first < second) - (first > second);
}
示例用法:
#include <stddef.h>
int weight_cmp = Person_compare(&pa, &pb, offsetof(struct Person, weight));
如果成员的类型不同,则可以使用_Generic
来引导比较函数选择。