Вы просто переопределяете их, определяя функции с одинаковой сигнатурой.Если они определены WEAK
в стандартной библиотеке, они будут переопределены, в противном случае они будут переопределены при первом разрешении, если ваша реализация передается компоновщику до поиска libc, она будет переопределена,Более того, файлы .o / .obj, в частности, используются в разрешении символов перед файлами .a / .lib, поэтому, если ваша реализация включена в исходный код проекта, она всегда будет переопределять.
Вы должны быть осторожны, чтобы получитьсемантика вашей реализации правильная.Например, rand()
возвращает целое число со знаком 0 в RAND_MAX, что, скорее всего, не то же самое, что аппаратное обеспечение RNG.Поскольку RAND_MAX является макросом, для его изменения потребуется изменить стандартный заголовок, поэтому вашей реализации необходимо применить существующий RAND_MAX.
Пример использования стандартной периферийной библиотеки STM32:
#include <stdlib.h>
#include <stm32xxx.h> // Your processor header here
#if defined __cplusplus
extern "C"
{
#endif
static int rng_running = 0 ;
int rand( void )
{
if( rng_running == 0 )
{
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
RNG_Cmd(ENABLE);
rng_running = 1 ;
}
while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { }
// Assumes RAND_MAX is an "all ones" integer value (check)
return (int)(RNG_GetRandomNumber() & (unsigned)RAND_MAX) ;
}
void srand( unsigned ) { }
#if defined __cplusplus
}
#endif
Для time()
применяется аналогично, и есть пример на Проблема с функцией time () во встроенном приложении с C