Какой заголовок определяет malloc () на какой платформе? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу использовать malloc() в программе на Си, которая должна быть кроссплатформенной.Но - где это?Я знаю, что языковые стандарты C89 и C99 требуют, чтобы он был доступен через <stdlib.h>, и все же - на некоторых платформах его там нет.Я заметил, что в некоторых случаях это может быть в <malloc.h>, и прочитал, что это может быть в <malloc/malloc.h>.

Мой вопрос: На каких платформах malloc() в каких местах?В частности, в трех местах, которые я упомянул?

Примечание. Пожалуйста, не предлагайте использовать кросс-платформенную среду разработки, которая не применима в моем случае.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Поскольку вопрос гласит, что стандарт требует, чтобы он был объявлен в <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> как услугу проекту.

0 голосов
/ 11 февраля 2019

Все соответствующие размещены C реализации имеют malloc in <stdlib.h> Отдельные реализации не требуются для предоставления <stdlib.h>

Ниже приведены некоторые полезные прямые ссылки на бесплатные файлы PDF стандартов C89 / C90, C99 и C11:

C89 / C90 (ISO / IEC 9899: 1990): https://www.pdf -archive.com / 2014/10/02 / ansi-iso-9899-1990-1 / ansi-iso-9899-1990-1.pdf

C99 (ISO / IEC 9899:1999): http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / n1256.pdf

C11 (ISO / IEC 9899: 2011): http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / n1570.pdf

C17 / 18 (ISO / IEC 9899: 2018) https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf

...