将 void 双指针类型转换为 void,为什么?
Typecasting void double pointer to void, why?
我正在处理的代码有一个函数,它有一个 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
...
}
它是一个双指针,意味着它是一个指向指针的指针。作为 void 类型,它可以容纳任何类型。所以我假设它将用于保存一个指针,在这种情况下,我假设开发人员不知道它将传递什么类型的指针,或者它保存已经在程序中声明和初始化的不同类型。
回调的类型可能是 LIBSSH2 库的 API 的一部分。该库将每个参数传递给它期望回调将需要的回调。无论那个参数是什么,这个特定的回调都不需要它。程序员有四种选择:
他可以省略原型中的参数名称,用void **
代替void **abstract
。这使得试图理解他的代码的人必须查看 LIBSSH2 API 才能理解最后一个参数是什么。
他可以不使用参数。但这会让他的编译器发出警告。
他可以以一种没有任何后果的方式使用参数来隐藏警告。
他可以把参数名注释掉,像这样:void ** /*abstract*/
.
这位程序员选择选项 3。
就个人而言,对于这种情况,我倾向于选择选项 4。我也希望看到这样的内容:
#define OK_UNUSED(a) if (false && (a)); else (void) 0
...
OK_UNUSED(abstract);
这就很清楚了,不用参数也没关系。
我正在处理的代码有一个函数,它有一个 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
...
}
它是一个双指针,意味着它是一个指向指针的指针。作为 void 类型,它可以容纳任何类型。所以我假设它将用于保存一个指针,在这种情况下,我假设开发人员不知道它将传递什么类型的指针,或者它保存已经在程序中声明和初始化的不同类型。
回调的类型可能是 LIBSSH2 库的 API 的一部分。该库将每个参数传递给它期望回调将需要的回调。无论那个参数是什么,这个特定的回调都不需要它。程序员有四种选择:
他可以省略原型中的参数名称,用
void **
代替void **abstract
。这使得试图理解他的代码的人必须查看 LIBSSH2 API 才能理解最后一个参数是什么。他可以不使用参数。但这会让他的编译器发出警告。
他可以以一种没有任何后果的方式使用参数来隐藏警告。
他可以把参数名注释掉,像这样:
void ** /*abstract*/
.
这位程序员选择选项 3。
就个人而言,对于这种情况,我倾向于选择选项 4。我也希望看到这样的内容:
#define OK_UNUSED(a) if (false && (a)); else (void) 0
...
OK_UNUSED(abstract);
这就很清楚了,不用参数也没关系。