带有 void * 指针的 Typedef 函数
Typedef function with void * pointer
>我正在尝试实现库中定义的函数,但我在使用它时遇到了问题。这个问题帮助我实现它,但我无法使用该功能。
这是类型定义:
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 及更早版本中,您不能将值绑定到函数指针。
- 类中的 Typedef 函数
- 为什么一次包装 typedef 函数签名与原始签名不匹配
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 将一个 typedef 函数指向另一个类中的另一个函数
- Typedef 函数与函数指针
- 如何在 C/C++ 中将 typedef 函数作为参数传递
- 是无限的Typedef函数指针继承
- 带有功能指针的Typedef:函数不存在
- typedef 函数不是类型名称
- 推导 typedef'd 函数指针的模板参数
- C/C++:使用 typedef'd 函数指针来 *声明* 函数
- 带有 void * 指针的 Typedef 函数
- 带有类 - 非静态成员调用的 typedef 函数声明
- 在 C++ 中将 typedef 函数从标头实现到源文件中
- 我可以在typedef函数签名中放入throw声明吗
- 对c++中类内typedef函数的怀疑
- typedef 函数在 C 语言中的用法
- 递归typedef函数定义:std::函数返回自己的类型
- typedef函数指针,在定义ClassName之前接受参数ClassName*
- 使用typedef函数指针的类型不完整