Поскольку вопрос гласит, что стандарт требует, чтобы он был объявлен в <stdlib.h>
.Я рекомендую проверить вашу документацию.Стандарт заключается в том, что должно быть объявлено в этом заголовке, но может быть объявлено в других заголовках (прямо или косвенно).
Если вы нацелены на некоторыесоответствующая платформа, где она не объявлена в <stdlib.h>
, очевидный ответ - #include
и <stdlib.h>
.Таким образом, вы хорошо работаете на совместимых платформах и о странном мяче, о котором вам известно.
Вы можете пойти так далеко, что получите еще один заголовок.Предположим, что он объявлен только в <string.h>
, тогда вы можете определить заголовок в вашем проекте "stdlibfix.h"
:
#include <string.h>
#include <stdlib.h>
NB: Защита заголовка опущена и фактически здесь не требуется.
Если он существует в каком-то нестандартном заголовке, например <memory.h>
, используйте условную компиляцию.Большинство компиляторов определяют некоторые макросы, идентифицирующие себя, такие как SMITH_COMPILER, тогда вам потребуется
#ifdef SMITH_COMPILER
#include <memory.h>
#endif
. Вы можете даже столкнуться с платформой, которая не позволяет динамическое выделение памяти, такой как небольшая встроенная платформа.То, как вы справляетесь с этим, выходит за рамки этого, за исключением того, что обычно лучше избегать этого, чем реализовывать его.В таких приложениях вы можете и должны рассчитать свои максимальные требования к хранилищу и реализовать их в виде переменных и массивов фиксированного размера.
Избегайте просто объявлять его прототип:
void *malloc(size_t sz);
На некоторых платформах malloc()
может быть объявлено по-разному (например, другое соглашение о вызовах).
Учитывая, что мы уже говорим о несовместимой платформе, которая не объявляет ее в <stdlib.h>
крайняя осторожность, безусловно, является порядком дня.
Сноска: Реальный ответ, если malloc()
отсутствует в <stdlib.h>
, это проверить документацию, проверить код на наличие каких-либо глупых ошибок (например, включает в себя <stdlib.h>
, но не 't из-за ошибки в логике условной компиляции), затем поднять заявку.10 к 1 у вас есть какой-то любительский компилятор, и, возможно, вам следует просто исправить <stdlib.h>
как услугу проекту.