【问题标题】:Typecasting void double pointer to void, why? [duplicate]将void双指针类型转换为void,为什么? [复制]
【发布时间】:2019-10-18 05:56:17
【问题描述】:

我正在处理的代码有一个函数,它有一个 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

    ...
}

【问题讨论】:

  • 这可能是一种消除编译器“参数未使用”警告的方法。

标签: c pointers void


【解决方案1】:

回调的类型可能是 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);

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

【讨论】:

  • 在我看来你提到的最后一个选项更容易理解。谢谢。
【解决方案2】:

这是一个双指针,意味着它是一个指向指针的指针。作为 void 类型,它可以容纳任何类型。所以我假设它将用于保存一个指针,在这种情况下,我假设开发人员不知道它将被传递什么类型的指针,或者它包含已经在程序中声明和初始化的不同类型。

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2016-01-12
    • 2015-02-14
    相关资源
    最近更新 更多