void **参数没有临时变量

时间:2014-08-19 15:47:20

标签: c pointers c11

我有一个像这样的原型的函数:

ErrorType function(void ** parameter, other_args);

此函数读取'参数'指向的指针并对其进行更改(将其视为realloc)。

现在,根据C标准,如果我想传递其他指针的地址而不是void *,我必须声明一个临时的void *变量并使用它。

所以我想创建一个包装器(我不在乎它是一个函数还是一个宏),用任何指针类型进行函数调用。

我想我可以在C11中使用_Generic和每个基本类型的函数,以及所有结构的函数和所有联合的函数,但我认为这太麻烦了。

我还读到了一个GCC扩展,它允许你在表达式中编写语句和声明,我认为我可以很容易地做到我想要的那样,但我更喜欢我的代码在所有标准编译器中编译,而不仅仅是GCC或Clang。

所以问题是,在C11编译器中没有太多问题,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,您希望function能够修改各种类型的指针。好吧,有关于此的坏消息和好消息。

坏消息:指针的对象表示是不透明的,因此您需要与function通信它应该使用哪种指针,除非您的函数保证复制对象表示来自源指针的对象表示,你知道这两个表示具有相同的含义。

例如,sizeof (double *)可能与sizeof (void *)

不同

好消息:指向任何对象类型的指针可以转换为void *并再次转发,其中包括void **double **任何其他指针类型。所以你可以:

ErrorType function(void * ptr, int ptr_type, ...) {
    void ** vpp;
    double ** dpp;
    ...

    ...
    switch (ptr_type) {
        case PTR_TYPE_VOIDP:
        vpp = ptr;
        /* Now you can work with *vpp */
        *vpp = ...
        break;

        case PTR_TYPE_DOUBLEP:
        dpp = ptr;
        /* Now you can work with *dpp */
        *dpp = ...
        break;
      }
    ...
  }
相关问题