创建通用 less then 函数

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

我希望实现类似的东西

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

但要区分两种情况 (1) < and (2) =,> 而不是区分 3 种情况 (1)<, (2)=, and (3)>。我的目标是减少使用指令的数量。

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.