在C++中放松void*cast

Mat*_*ner 6 c c++ casting void-pointers

在C中,指向和来自指针并不是错误void *.

移植到C++的一个主要障碍是需要在从处理泛型指针的函数返回时转换指针,例如malloc,在我自己的代码中声明的函数void *block_get(Blkno const blkno);.

然而,我的代码应该由C C++编译器成功编译.如果我为了C++而在任何地方提供显式的强制转换,它们必须是C风格的强制转换,并且我可能会因为从两种语言的指针类型转换非指针类型而屏蔽错误.

我的参考错误如下:

struct Cpfs *cpfs = calloc(1, sizeof(*cpfs));
Run Code Online (Sandbox Code Playgroud)

在MSVC中产生:

错误2错误C2440:'初始化':无法从'void*'转换为'Cpfs*'e:\ src\cpfs\cpfs.c 179

显然,如果我不再使用C,我就不能使用new或者static_cast我自然会使用.对于每种语言提供最大类型安全性的最佳方法是void *什么?最简单的问题是什么?

Has*_*kun 5

我建议要么简单地使用C样式转换,要么将转换包装在一个宏中,该宏可以扩展为空(在C中),也可以static_cast在C++中扩展.

  • 来自`void*`的`reinterpret_cast`不是最好的演员.`static_cast`就足够了,并且不太可能无效地将无效源转换为指针类型. (3认同)

Mil*_*lan 0

也许是这样的?(未经测试,没有可用的编译器,不经常使用宏):

#ifdef __cplusplus
    #define pointer_cast(type, pointer) reinterpret_cast<type>(pointer)
#else
    #define pointer_cast(type, pointer) (type)(pointer)
#endif
Run Code Online (Sandbox Code Playgroud)