我希望实现类似的东西
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
但要区分两种情况 (1) < and (2) =,> 而不是区分 3 种情况 (1)<, (2)=, and (3)>。我的目标是减少使用指令的数量。
您的代码无法工作,因为不同的数据类型使用不同的机器表示。
定义
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
,然后没有值!