【发布时间】:2011-04-20 10:32:58
【问题描述】:
在 C 中,将指针转换为 void * 和从其转换不是错误。
移植到 C++ 的一个主要障碍是在从处理泛型指针(例如 malloc)的函数以及在我自己的代码中声明的函数(例如 void *block_get(Blkno const blkno);)返回时需要转换指针。
然而,我的代码旨在由 C 和 C++ 编译器成功编译。如果我为了 C++ 而在任何地方都提供了显式转换,那么它们必须是 C 风格的转换,并且由于在两种语言的指针类型之间转换非指针类型,我可能会掩盖错误。
我的参考错误如下:
struct Cpfs *cpfs = calloc(1, sizeof(*cpfs));
在 MSVC 中产生:
错误 2 错误 C2440: 'initializing' : 无法从 'void *' 转换为 'Cpfs *' e:\src\cpfs\cpfs.c 179
显然我不能使用new 或static_cast,如果我不再使用C,我自然会使用它们。围绕void *为每种语言提供最大类型安全的最佳方法是最少的冗长?
【问题讨论】:
-
为什么需要移植到 C 和 C++ 的公共子集?正如您所发现的,它严重限制了您可以使用的 C(或者 C++)。几乎所有有 C++ 可用的环境也有 C 可用,并且还允许您将 C++ 和 C 目标文件链接在一起。我看不出移植到公共子集有什么好处。
-
为了 C 中的类型安全(这有点难),为每个结构创建一个函数,其工作是分配并返回一个指向新结构的指针。同样,创建一个释放结构的函数。
-
我想知道尝试编写一个为两种不同语言编译的程序的基本原理。这通常是留给谜题的东西。
-
顺便说一句,在 C++ 中,您应该使用
static_cast转换为/从void*转换。 -
10 次中有 9 次,头文件中的
static inline是虚假的过早优化。
标签: c++ c casting void-pointers