我试着这样做:我不确定-这是正确的方式。或者我可能不得不编写包装器函数,但like是更好的方法。另外,将来其他开发人员希望使用来自另一个库、平台的散列函数,这取决于不同用途的性能要求。
创建的结构:

typedef struct Hashctx{
    char inStream[BUFSIZ];
    char outHash[MAX_HASH];
    int (*Hashing)(char* DstBuf, size_t DstBufSize, \
           size_t *olen, char* SrcBuf, size_t SrcBufSize);
}Hashctx;
Hashctx App1;

并尝试如下初始化:
init()
{
#ifdef PLATFORM
    App1.Hashing = SHA1sumPlatform;
#elif
    App1.Hashing = SHA1sum;
#endif
}

虽然这两个函数采用的参数相同,但返回类型不同。我陷入了错误cannot assigned be entity of type ...no definition for App1
int SHA1sum(...)
uint32_t SHA1sumPlatform(...)

我试过打字也没有解决这个错误
Hashing = (int)SHA1sumPlatform;

谢谢你

最佳答案

在这行Hashing = (int)SHA1sumPlatform;中,您试图用function pointer来转换int,这不是转换函数指针的正确方式。
如果确定int是所需的正确返回类型,请执行以下操作:

typedef int (*HashingFnType)(char* DstBuf, size_t DstBufSize, \
           size_t *olen, char* SrcBuf, size_t SrcBufSize);

typedef struct Hashctx{
    char inStream[BUFSIZ];
    char outHash[MAX_HASH];
    HashingFnType Hashing ;
}Hashctx;

init()
{
#ifdef PLATFORM
    Hashing = (HashingFnType)SHA1sumPlatform;
#elif
    Hashing = (HashingFnType)SHA1sum;
#endif
}

注意:要使用不同类型转换函数指针,两种类型都应兼容。阅读更多关于它的here

关于c - 功能ptr分配类型转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54759287/

10-11 22:10
查看更多