带有void *指针的Typedef函数

时间:2015-02-03 20:29:09

标签: c++ c pointers

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

这是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   (稍后记录)可以传递给任何需要a的库函数   paillier_get_rand_t,或者您可以实现自己的。如果你实施   你自己的这个功能,它应该填写" len"中的随机字节   阵列" buf"。 * /

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

3 个答案:

答案 0 :(得分:2)

我在这里猜一点,因为你没有显示所有功能的原型(及其文档),但你几乎肯定想要这样:

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;
    }
}

答案 1 :(得分:2)

我找到了解决方案。首先,我像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);

无需定义任何其他功能。

答案 2 :(得分:1)

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

(*get_rand_funtion)(&buf, 4)

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