2

我正在尝试编写一个函数来比较两个指针数组,看看它们是否相同。我想在任何指针数组上使用该函数,即无论指针指向什么 - 我只是对指针本身的相等性感兴趣

我写了这个:

/**
 * Return true if arrays (of type ptr to ptr) are equal
 */
bool ptr_array_eq(const void **x, const void **y, size_t n)
{
    size_t i;
    for (i=0; i<n; i++) {
        if (x[i] != y[i]) {
            return false;
        }
    }
    return true;
}

我的单元测试如下所示:

void testPTR_ARRAY_EQ(void)
{
    Mode *m1, *m2, *m3, *m4, *m5, *m6;

    Mode *a[] = {m1, m2, m3, m4, m5};
    Mode *b[] = {m1, m2, m3, m4, m5};
    Mode *c[] = {m2, m3, m4, m5, m6};
    Mode *d[] = {m1, m3, m4, m5, m6};

    CU_ASSERT(ptr_array_eq(a, a, 4));
    CU_ASSERT(ptr_array_eq(a, b, 4));
    CU_ASSERT(! ptr_array_eq(a, c, 4));
    CU_ASSERT(! ptr_array_eq(a, d, 4));
}

但是当我编译时,我收到以下警告(不是错误):

test_utility.c: In function ‘testPTR_ARRAY_EQ’:
test_utility.c:648:5: warning: passing argument 1 of ‘ptr_array_eq’ from incompatible pointer type [enabled by default]
../src/glamdring2.h:327:6: note: expected ‘const void **’ but argument is of type ‘struct Mode **’

编译器抱怨在我的单元测试中我使用的类型与函数原型不匹配

但我对底层类型并不感兴趣,只对指向它的指针感兴趣。我是不是该:

  • a) 忽略警告
  • b) 以使编译器不发出警告的方式重写函数
  • c) 对传入的指针进行一些转换
  • d) 接受 C 不喜欢不知道底层类型的想法,并为我可能遇到的每种类型的指针重新编写函数
4

1 回答 1

3

您的函数需要(指向第一个元素的指针)一个const void*.

您正在尝试将它(指向第一个元素的指针)传递给Mode*.

这在 C 中是不允许的,因为(除其他原因外)C 标准甚至不保证它void*Mode*大小相同。因此,该语言不会让程序意外地将一个数组视为另一个数组。

在实现特定细节友好的前提下,它们几乎适用于任何实现,您可以使用它memcmp来比较数组。

于 2012-07-10T08:32:46.923 回答