Давайте посмотрим, что говорит об этом стандарт C99:
См. 7.1.3, § 1, пункт 5:
Каждый идентификатор с областью файла, указанной в любом из следующих подпунктов [...], зарезервирован для использования в качестве имени макроса и в качестве идентификатора с областью файла в том же пространстве имен , если любой из связанных с ним заголовков включен .
Поскольку вы включаете stdlib.h
, имя malloc
зарезервировано для использования в качестве имени макроса.
Но 7.1.4, §1 позволяет использовать #undef
для зарезервированных имен:
Использование #undef
для удаления любого определения макроса также гарантирует, что
фактическая функция называется.
Это позволяет повторно #define
malloc
, что приводит к неопределенному поведению в соответствии с 7.1.3, §2:
Если программа [...] определяет зарезервированный идентификатор как имя макроса, поведение не определено .
Почему стандарт устанавливает это ограничение? Поскольку другие функции стандартной библиотеки могут быть реализованы как функциональные макросы в терминах исходной функции, поэтому скрытие объявления может нарушить эти другие функции.
На практике с вами должно быть все в порядке, если ваше определение malloc
удовлетворяет всем положениям, предусмотренным стандартом для библиотечной функции, что может быть достигнуто путем переноса фактического вызова в malloc()
.