带有 void * 指针的 Typedef 函数

Typedef function with void * pointer

本文关键字:Typedef 函数 指针 void 带有      更新时间:2023-10-16

>我正在尝试实现库中定义的函数,但我在使用它时遇到了问题。这个问题帮助我实现它,但我无法使用该功能。

这是类型定义:

typedef void (*paillier_get_rand_t) ( void* buf, int len );

这是我如何实现它:

void get_rand(void* buf, int len) {
  buf = (void *)rand();  // I don't know if it works but isn't the problem
}

在这里,我如何创建指向函数的指针并调用它。

   int modulus = 4;
    void* buf;
    paillier_pubkey_t* pub;
    paillier_prvkey_t* prv;
    paillier_keygen(modulus, &pub, &prv, &get_rand);                

问题1)我如何发送参数 buf 和 len?问题2)现在错误不同:

reference to `paillier_keygen(int, paillier_pubkey_t**, paillier_prvkey_t**, void (*)(void*, int))' undefined

函数paillier_keygen用于生成算法的相应键,函数get_rand用于获取概率算法所需的随机性。

我正在实现这个 typedef,因为我需要这样做才能使用库。

编辑:

找到了一个已经定义的函数,我可以使用称为paillier_get_rand_devurandom

/* 这些函数可以传递给paillier_keygen和 paillier_enc函数来提供随机数源。这 首先从/dev/random 读取字节。在 Linux 上,此设备 专门返回从环境噪声中收集的熵和 因此,当没有足够的可用时,经常会阻止。第二个 从/dev/urandom 返回字节。在 Linux 上,此设备也会返回 环境噪声,但用伪随机数增强它 发电机不足时可用。后者可能是 更好的选择,除非您有特定的理由相信它是 不足。*/

void paillier_get_rand_devurandom( void* buf, int len );

如果我像以前一样使用

paillier_keygen(modulus, &pub, &prv, paillier_get_rand_devurandom(buf, 4));

我得到error: invalid use of void expression

如果我这样使用:

paillier_keygen(modulus, &pub, &prv, &paillier_get_rand_devurandom);

我得到:

undefined reference to `paillier_get_rand_devurandom(void*, int)'
undefined reference to `paillier_keygen(int, paillier_pubkey_t**, paillier_prvkey_t**, void (*)(void*, int))'

包括库。在这里,我添加有关签名的更多信息:

/* 使用随机性生成长度模数位的关键对 提供了get_rand功能。将为每个 键,并且给定的指针将设置为指向新的 paillier_pubkey_t和paillier_prvkey_t结构。函数 paillier_get_rand_devrandom和paillier_get_rand_devurandom可能是 作为最终参数传递。*/

void paillier_keygen( int modulusbits,
            paillier_pubkey_t** pub, paillier_prvkey_t** prv, paillier_get_rand_t get_rand );

/* 这是用于获取 概率算法所需的随机性。函数 paillier_get_rand_devrandom和paillier_get_rand_devurandom (稍后记录)可以传递给任何需要 paillier_get_rand_t,或者您可以实现自己的。如果实现 你自己的这样的函数,它应该在 数组"buf"。*/

typedef void (*paillier_get_rand_t) ( void* buf, int len );

我在这里有点猜测,因为您没有显示所有函数(及其文档)的原型,但您几乎肯定想要这个:

paillier_pubkey_t* pub;
paillier_prvkey_t* prv;
paillier_keygen(modulus, &pub, &prv, &get_rand);

get_rand可能会做这样的事情:

void get_rand(void* buf, int len)
{
    char* bytes = (char*)buf;
    for (int i = 0; i != len; ++i) {
        bytes[i] = rand() & 0xff;
    }
}

我找到了解决方案。首先,我像extern一样导入库,因为paillier.h是用C编写的,我正在使用C++。

就像这样:

use #include <gmp.h>
extern "C"{
    #include "paillier.h"
}

之后我还与-lpaillier一起编译,也-lgmp.

最终代码将是:

paillier_pubkey_t* pub;
    paillier_prvkey_t* prv;
    paillier_keygen(1024, &pub, &prv, paillier_get_rand_devurandom);

无需定义任何其他函数。

当您声明以下内容时,您正在取消引用和调用get_rand_function的值:

(*get_rand_funtion)(&buf, 4)

由于声明的返回类型为 void,因此编译器将表达式的结果解释为 void,这不是函数参数的有效类型。 如果您希望传递指向函数paillier_keygen的指针,则@Cameron代码是正确的。 至少在 C99 及更早版本中,您不能将值绑定到函数指针。