Ошибка в программе c конфликтующих типов для xx и предыдущего неявного объявления xx была здесь - PullRequest
0 голосов
/ 15 января 2012

Предположим, у меня есть файл insert.c, в котором определены две функции: 1.insert_after 2.insert_before

Определения этих функций примерно такие:

insert_after(arg1)
{ 
  if(condition 1)
    { ......... } 
  else
    insert_before(arg1); 
}

insert_before(arg)
{ 
  if(condition 1)
    { ......... } 
  else
    insert_after(arg); 
}

Теперь, если этот файл insert.c включен в main.c и функция insert_after называется

# include "insert.c"
int main()
{
  insert_after(arg);
  return 0;
}

При компиляции main.c с использованием gcc возникает следующая ошибка:

конфликтующие типы для "insert_before"

примечание: предыдущее неявное объявление "insert_before" было здесь

Что здесь не так и как этого избежать?

Ответы [ 4 ]

1 голос
/ 15 января 2012

Это потому, что вы не объявляете прототипы для своих функций.Функция, которая не имеет прототипа, по умолчанию имеет неизвестный набор аргументов и возвращает int.Но это не относится к insert_before.

. Создайте файл insert.h, в котором вы их объявите:

#ifndef INSERT_H
#define INSERT_H

void insert_before(type_of_arg);
void insert_after(type_of_arg);

#endif /* INSERT_H */

и включите этот файл в начало insert.c.

Затем вы должны скомпилировать:

gcc -Wall -Wstrict-prototypes -Wmissing-prototypes -o progname insert.c main.c
1 голос
/ 15 января 2012

создайте файл .h и передайте этим функциям прототипы (запись в Википедии, описывающая прототипы, связана с вами).

файл .h будетсодержать только функции:

insert_before(arg);
insert_after(arg);

Кроме того, у вас, вероятно, должен быть тип возвращаемого значения и тип параметра (например, void insert_before(char * arg); Компиляторы действительно хороши с проверкой типов, и это избавит вас от головной боли позже.

0 голосов
/ 15 января 2012

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

void insert_before(int arg)
{
...
}

Чтобы две функции вызывали друг друга, вам нужно будет объявить как минимум одну,но обычно вы делаете это для всех своих функций и помещаете его в общий файл .h, который включается в ваши исходные файлы, использующие эту функцию.Эти «предварительные объявления» обычно называются прототипами функций и выглядят так:

void insert_before(int arg);
void insert_after(int arg);

Отступ - это реальная проблема ... это может быть симптомом публикации в SO, но публикация кода здесьтакже более читабельным, если он имеет отступ.

Кроме того, если условие 1 одинаково в обеих функциях, то вы, вероятно, будете иметь бесконечные рекурсивные вызовы, которые приведут к переполнению стека.

0 голосов
/ 15 января 2012

Проблема в том, что вы вызываете insert_before до того, как об этом узнает компилятор. Дайте им соответствующие прототипы (в файле заголовка) и включите файл заголовка в оба файла: insert.c и main.c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...