この質問は C と C++ の両方でタグ付けされているため、少なくとも 2 つの回答があります。
C
ええと...好きなことをしてください。
上記の「「stdlib」を含めないと警告が表示されない」という理由は有効ではないと思います。ヘッダーを含めることを忘れないように、この種のハックに頼るべきではないからです。
キャストを書かない本当の理由は、C コンパイラがすでに avoid *
をあなたが望むポインタ型に暗黙のうちにキャストしているためです。
タイプ セーフが必要な場合は、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 スタイルのキャストで記述することを意味します。