This question already has answers here:
Closed 22 days ago.
What does casting to `void` really do?
(4个答案)
我正在处理的代码有一个void类型的双指针函数,在函数指针中,双指针被类型转换为void,并且指针在其他任何地方都不使用。我找不到为什么要这样做。请有人给我点光。
这就很清楚了,参数不用也没关系。
(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/