Вы не можете использовать функцию до ее правильного определения без прототипа. buddy_malloc()
использует buddy_findout()
перед его созданием или созданием, что компилятор будет рассматривать как определение.
Прототип buddy_findout()
до определения buddy_Malloc()
или определение buddy_findout()
до определения buddy_Malloc()
.
Я предлагаю прототипы, то есть:
void *buddy_Malloc(int);
void *buddy_findout(int, int);
... Прямо под твоим последним #include
Это позволяет избежать путаницы в порядке, в котором вы определяете вещи. Кроме того, рассмотрите возможность использования size_t
(самый большой тип unsigned int, доступный в архитектуре) вместо целых чисел со знаком при указании размеров.
Вот ваш код (исправленный) с использованием обоих методов. Способ 1 - с использованием прототипов:
void *buddy_Malloc(int);
void *buddy_findout(int, int);
void* buddyMalloc(int req_size)
{
//Do something here//
return buddy_findout(original_index,req_size); //This is the recursive fn I call//
}
void *buddy_findout(int current_index,int req_size)
{
char *selected = NULL;
if(front!=NULL)
{
if(current_index==original_index)
{
//Do something here//
return selected ; //
}
else
{
//Do Something here//
return buddy_findout(current_index+1,req_size);
}
}
else
{
return buddy_findout(current_index-1,req_size);
}
}
И способ 2, просто переупорядочив:
void *buddy_findout(int current_index,int req_size)
{
char *selected = NULL;
if(front!=NULL)
{
if(current_index==original_index)
{
//Do something here//
return selected ; //
}
else
{
//Do Something here//
return buddy_findout(current_index+1,req_size);
}
}
else
{
return buddy_findout(current_index-1,req_size);
}
}
void* buddyMalloc(int req_size)
{
//Do something here//
return buddy_findout(original_index,req_size); //This is the recursive fn I call//
}
В некоторых кругах искусство в некотором роде считается не требующим прототипов для статических функций, это как бы демонстрирует, что программа была запланирована в чьей-то голове до того, как был написан код. В любом случае, мне нечего сказать об этом, кроме как рекомендовать прототипы даже для статических функций тем, кто все еще изучает гайки и болты языка C.
Если buddy_*
будет выставлено для использования другими модулями, вам действительно нужны прототипы. Трудно сказать, хотите ли вы, чтобы они были статичными или нет.
Edit:
Если вы помещаете прототипы во внешний файл заголовка, вам нужно использовать include guard , чтобы гарантировать, что каждый модуль включает их только один раз (и не переопределяет их как точно такие же вещь).
Вот пример buddy.h
:
#ifndef BUDDY_H
#define BUDDY_H
void *buddy_Malloc(int);
void *buddy_findout(int, int);
#endif /* BUDDY_H */
Препроцессор не даст вашим модулям выдать эту ошибку.