错误的通用 less then 函数

问题描述 投票:0回答:1

我假设以下函数可以获取任何数据类型(例如 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))
c generics void-pointers
1个回答
1
投票

您的代码无法工作,因为不同的数据类型使用不同的机器表示。

定义

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
,然后没有值!

© www.soinside.com 2019 - 2024. All rights reserved.