Этот вопрос помечен как для 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.