我正在尝试实现库中定义的函数,但是我遇到了使用它的问题。 这个问题帮助我实现它,但我无法使用该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及更早版本中,您可能无法将值绑定到函数指针。
以上就是c/c++开发分享带有void *指针的Typedef函数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519492.html