这个问题被标记为 C 和 C++,所以它至少有两个答案,恕我直言:
C
咳咳……随心所欲。
我相信上面给出的原因“如果你不包含“stdlib”那么你将不会收到警告”不是一个有效的理由,因为人们不应该依赖这种黑客来不要忘记包含一个标题.
可能让你不编写强制转换的真正原因是 C 编译器已经默默地将 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 风格的演员表编写演员表。