带有void *指针的Typedef函数

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

这是typedef:

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,因为我需要这样做才能使用lib。

编辑:

我找到了一个已定义的函数,我可以使用名为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”中填入“len”随机字节。 * /

 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  extern "C"{ #include "paillier.h" } 

之后我还用-lpaillier-lgmp编译。

最终的代码是:

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

无需定义任何其他function。

当您声明以下内容时,您将取消引用并调用get_rand_function的值:

 (*get_rand_funtion)(&buf, 4) 

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