Конфликтующие типы возврата - PullRequest
2 голосов
/ 28 марта 2010

Я выполняю рекурсивную программу и получаю сообщение об ошибке конфликтующих типов:

void* buddyMalloc(int req_size)
{ 
     // Do something here
     return buddy_findout(original_index,req_size); // This is the recursive 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);
    }
}

Ошибка:

buddy.c: At top level:
buddy.c:76: error: conflicting types for ‘buddy_findout’
buddy.c:72: note: previous implicit declaration of ‘buddy_findout’ was here

Обратите внимание, что файл buddy.c, в котором я определяю это, не содержит main и связан с несколькими другими файлами .c.

Ответы [ 3 ]

1 голос
/ 28 марта 2010

Вы не можете использовать функцию до ее правильного определения без прототипа. 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 */

Препроцессор не даст вашим модулям выдать эту ошибку.

0 голосов
/ 28 марта 2010

buddy_findout объявлено как возвращающее указатель на void, но в одном месте вы пытаетесь вернуть selected, который является указателем на символ. Как уже отмечали другие, вам также нужен прототип для buddy_findout:

void *buddy_findout(int, int);

void *buddy_malloc(int req_size) { 
    return buddy_findout(original_index,req_size);
}

void *buddy_findout(int current_index, int req_size) {
// ...
    if (current_index == original_index)
        return (void *)selected;
// ...
}
0 голосов
/ 28 марта 2010

Я думаю, это должно быть с отсутствующими прототипами.

Добавить прототип функции

void *buddy_findout(int current_index,int req_size);

перед функцией buddyMalloc

...