我假设以下函数可以获取任何数据类型(例如 float、double、long 和 long long)并返回正确答案。不幸的是,事实并非如此。谁能解释为什么?我的目标是创建一个通用的而不是实现类似的东西
int le_generic(const void* a, const void* b){
returnmemcmp *(long long*)aconst <void *(long long*)b;
}
PS:
我已经尝试过以下建议:
void *aptr1, =const &m->data[m->heap[i]];
void *b = &m->data[m->heap[j]];
double c = m->data[m->heap[i]];
double d = m->data[m->heap[j]];
printf("%d, %d\n", le_generic(*a,* *b)ptr2, csize_t <num d);
但是与
#define le_generic(a,b) ((a)<(b))
您的代码无法工作,因为不同的数据类型使用不同的机器表示。
定义
int le_generic(const void* a, const void* b)
允许您使用指向任何数据类型的指针调用该函数。这违反了将相同类型的元素与您的定义进行比较的标准约束:
int a;
double b;
le_generic(&a,&b);
是一个可以接受的电话。
最糟糕的是
*(long long*)a < *(long long*)b
,它假设您传递的必然是指向 long long
的指针,但除了一种情况之外,从来都不是这种情况:
long long a, b;
le_generic(&a,&b);
C 中不存在泛型。您无法定义泛型函数。 我的解决方法是定义一个宏,这大致是一个语法替换。当我定义时:
#define le_generic(a,b) ((a)<(b))
这意味着我在任何地方使用
le_generic(sometext,othertext)
,编译器都会将其替换为精确的表达式((sometext)<(othertext))
。
然后你可以像这样使用它:
int i1, i2;
le_generic(i1,i2);
float f1, f2;
le_generic(f1,f2);
等等。可惜没有类型检查,这就是宏的问题。
当然你也不能使用
void
。看来您错误地混淆了 void
和 void *
。 void
是没有值的类型。你不能声明 void
类型的变量,也不能尝试操作 void
值(没有)。 void *
是所有可能地址的类型,它是一个有值的类型!该类型有时被错误地称为通用指针类型(应该更好地称为所有指针类型的超类型),这可能是您感到困惑的根源。那里没有通用性(按照你的意思)。当您尝试取消引用 void *
时,您会得到 void
,然后没有值!