这个问题被标记为 C 和 C++,所以它至少有两个答案,恕我直言:
C
咳咳……随心所欲。
我相信上面给出的原因“如果你不包含“stdlib”那么你就不会收到警告”不是一个有效的原因,因为人们不应该依赖这种黑客来不要忘记包含一个标题。
可能使您不编写强制转换的真正原因是 C 编译器已经默默地将 a 强制void *
转换为您想要的任何指针类型,因此,自己做是矫枉过正和无用的。
如果您想要类型安全,您可以切换到 C++ 或编写自己的包装函数,例如:
int * malloc_Int(size_t p_iSize) /* number of ints wanted */
{
return malloc(sizeof(int) * p_iSize) ;
}
C++
有时,即使在 C++ 中,您也必须从 malloc/realloc/free 实用程序中获利。然后你必须投。但你已经知道了。与往常一样,使用 static_cast<>() 会比 C 风格的强制转换更好。
而在 C 语言中,您可以通过模板覆盖 malloc(和 realloc 等)以实现类型安全:
template <typename T>
T * myMalloc(const size_t p_iSize)
{
return static_cast<T *>(malloc(sizeof(T) * p_iSize)) ;
}
这将被用作:
int * p = myMalloc<int>(25) ;
free(p) ;
MyStruct * p2 = myMalloc<MyStruct>(12) ;
free(p2) ;
和以下代码:
// error: cannot convert ‘int*’ to ‘short int*’ in initialization
short * p = myMalloc<int>(25) ;
free(p) ;
不会编译,所以,没问题。
总而言之,在纯 C++ 中,如果有人在您的代码中发现多个 C malloc,您现在没有任何借口... :-)
C + C++ 交叉
有时,您想要生成可以在 C 和 C++ 中编译的代码(无论出于何种原因……这不是 C++extern "C" {}
块的重点吗?)。在这种情况下,C++ 需要强制转换,但 C 不会理解 static_cast 关键字,因此解决方案是 C 风格的强制转换(正是由于这种原因,在 C++ 中仍然是合法的)。
请注意,即使编写纯 C 代码,使用 C++ 编译器编译它也会给您带来更多警告和错误(例如,尝试使用函数而不首先声明它不会编译,这与上面提到的错误不同)。
因此,为了安全起见,编写可以在 C++ 中干净编译的代码,研究并纠正警告,然后使用 C 编译器生成最终的二进制文件。这意味着,再次以 C 风格的演员表编写演员表。