This question already has answers here:
Closed 22 days ago.
What does casting to `void` really do?
(4个答案)
我正在处理的代码有一个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

    ...
}

最佳答案

回调的类型可能是LIBSSH2库的API的一部分。库将每个参数传递给它希望回调需要的回调。不管那个参数是什么,这个回调函数都不需要它。程序员有四种选择:
他可以省略原型中参数的名称,用void **abstract替换void **。这使得试图理解他的代码的人必须查看LIBSSH2 API才能理解最后一个参数是什么。
他不能用这个参数。但这会让他得到编译器的警告。
他可以用一种不会隐藏警告的方式使用参数。
他可以注释掉参数名,比如:void ** /*abstract*/
这个程序员选择选项3。
就我个人而言,我倾向于选择4。我也喜欢看这样的东西:

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

...

OK_UNUSED(abstract);

这就很清楚了,参数不用也没关系。

关于c - 类型转换void指向void的双指针,为什么? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58444728/

10-12 14:47
查看更多