1

我的实际问题是,当您实际上知道这些值是相同类型时,是否真的可以比较两个 void 指针中包含的值?例如 int。

void compVoids(void *firstVal, void *secondVal){
     if (firstVal < secondVal){
          cout << "This will not make any sense as this will compare addresses, not values" << endl;
     }
} 

实际上我需要比较两个 void 指针值,而在函数之外已知类型是 int。我不想在函数内部使用 int 的比较。所以这对我也不起作用:有if (*(int*)firstVal > *(int*)secondVal) 什么建议吗?非常感谢您的帮助!

4

4 回答 4

6

为了比较 a 指向的数据void*,你必须知道类型是什么。如果您知道类型是什么,则不需要void*. 如果要编写可用于多种类型的函数,请使用模板:

template<typename T>
bool compare(const T& firstVal, const T& secondVal)
{
    if (firstVal < secondVal)
    {
        // do something
    }
    return something;
}

为了说明为什么尝试盲目比较 void 指针是不可行的:

bool compare(void* firstVal, void* secondVal)
{
    if (*firstVal < *secondVal) // ERROR:  cannot dereference a void*
    {
        // do something
    }
    return something;
}

因此,您需要知道要比较的大小,这意味着您要么需要传入std::size_t参数,要么需要知道类型(实际上,为了传入std::size_t参数,您必须知道类型):

bool compare(void* firstVal, void* secondVal, std::size_t size)
{
    if (0 > memcmp(firstVal, secondVal, size))
    {
        // do something
    }
    return something;
}

int a = 5;
int b = 6;
bool test = compare(&a, &b, sizeof(int)); // you know the type!

这在 C 中是必需的,因为模板不存在。C++ 有模板,这使得这种类型的函数声明变得不必要和低级(模板允许强制类型安全 - void 指针不允许,如下所示)。

当你做这样的事情(愚蠢)时,问题就来了:

int a = 5;
short b = 6;
bool test = compare(&a, &b, sizeof(int)); // DOH! this will try to compare memory outside the bounds of the size of b
bool test = compare(&a, &b, sizeof(short)); // DOH!  This will compare the first part of a with b.  Endianess will be an issue.

正如您所看到的,这样做会失去所有类型安全性,并且需要处理大量其他问题。

于 2013-11-07T03:04:10.520 回答
0

您需要取消引用它们并使用

if (*(int*) firstVal < *(int*) secondVal)

int如果您知道这两个值将是int并且您想比较int它们指向的值,为什么您不想在函数内部使用比较?


您提到了用于比较插入数据的比较功能;对于比较功能,我推荐这个:

int
compareIntValues (void *first, void *second)
{
    return (*(int*) first - *(int*) second);
}

如果第一个较小,它遵循负的约定,如果它们相等,则为 0,如果第一个较大,则为正。当您想要比较int数据时,只需调用此函数即可。

于 2013-11-07T02:14:15.183 回答
0

这绝对是可能的,但由于它们是 void 指针,您必须指定要比较多少数据以及如何比较。

memcmp 函数可能是您正在寻找的。它需要两个 void 指针和一个参数来表示要比较的字节数并返回一个比较结果。然而,一些比较并不取决于所有数据都相同。例如:比较两个向量的方向,忽略它们的长度。

除非您指定要如何比较数据,否则此问题没有明确的答案。

于 2013-11-07T02:50:04.493 回答
0

是的。事实上,如果类型是 unsigned int,那么您的代码是正确的。甚至不推荐使用将 int 值强制转换为 void 指针。

您也可以转换指针,但必须将它们直接转换为 int 类型:

if ((int)firstVal < (int)secondVal)

注意:根本没有*。

如果您构建 32 位和 64 位,您可能会解决模型问题。检查intptr_t您可以用来避免这种情况的类型。

if ((intptr_t)firstVal < (intptr_t)secondVal)
于 2013-11-07T06:00:55.320 回答