类型转换void指向void的双指针,为什么?

时间:2019-10-18 05:56:17

标签: c pointers void

我正在处理的代码具有一个函数,该函数具有一个类型为void的双指针,在该函数指针中,该双指针被强制转换为void,并且该指针在其他任何地方都没有使用。我找不到任何地方为什么这样做。有人请阐明一下。

static void kbd_callback(const char *name, int name_len,
                         const char *instruction, int instruction_len,
                         int num_prompts,
                         const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,
                         LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,
                         void **abstract /* <-- This */)
{
    int i;
    size_t n;
    char buf[1024];
    (void)abstract; // <---- and this

    ...
}

2 个答案:

答案 0 :(得分:4)

回调的类型可能是LIBSSH2库的API的一部分。该库将每个参数传递给它预期该回调将需要的回调。无论该参数是什么,此特定的回调都不需要它。程序员有四个选择:

  1. 他可以省略原型中参数的名称,将void **abstract替换为void **。这样一来,试图理解他的代码的人就必须查看LIBSSH2 API才能了解最后一个参数是什么。

  2. 他不能使用该参数。但这会向他的编译器发出警告。

  3. 他可以以没有后果的方式使用该参数来隐藏警告。

  4. 他可以注释掉参数名称,例如:void ** /*abstract*/

该程序员选择选项3。

就个人而言,我倾向于这种情况下的选项4。我也希望看到这样的东西:

#define OK_UNUSED(a) if (false && (a)); else (void) 0

...

OK_UNUSED(abstract);

这很清楚地表明该参数未使用是可以的。

答案 1 :(得分:0)

这是一个双指针,表示它是指向指针的指针。类型为void,可以容纳任何类型。因此,我假设它将用于保存一个指针,在这种情况下,我假设开发人员不知道它将传递哪种类型的指针,或者它持有程序中已经声明和初始化的不同类型。