【发布时间】:2017-05-11 12:48:07
【问题描述】:
上下文:
我有一段代码在编译为 C 时可以正常编译和运行,我正在尝试将其移植到 C++ 以便能够在未来的 C++ 程序中使用它。
我在我的程序中使用这种结构数据类型。
typedef struct MessageDigest{
int32_t digestLen;
void* ctx;
int (*Init)(void* c);
int (*update)(void* c, const void* data, size_t len);
int (*Final)(uint8_t* md, void* c);
}MessageDigest;
在我的主要功能中,我正在影响结构的标识符:
MessageDigest* newMD;
/*Other code*/
newMd->Init=&SHA1_Init; //The problem is here
我收到此错误:
invalid conversion from ‘int (*)(SHA_CTX*) {aka int (*)
(SHAstate_st*)}’ to ‘int (*)(void*)’ [-fpermissive]
我尝试使用static_cast<>,但它不起作用
【问题讨论】:
-
显示
SHA1_Init的定义 -
该消息是不言自明的。
int (*)(SHA_CTX*)与int (*)(void*)不同,您不能将一个分配给另一个。 -
得问...为什么在 C++ 中使用这样的函数指针?它与某些遗留的 C 库有关吗?
-
从语言实现的角度来看,在 CPP 中使用它是非常好的,这就是我所说的。它既不被认为是“现代的”也不被认为是类型安全的,这写在另一张纸上。 “auto”关键字也是现代的,它是类型安全的,但我仍然认为它很糟糕,因为它通过将“所有类型推导给编译器”并给出一个 sh** 来降低现代 cpp 编码器的意识是什么有效地完成。正确使用 void* 至少需要开发人员知道他在做什么。但这很哲学:D @hyde
标签: c++ type-conversion