2012-01-15 2 views
-1

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

Определения этих FUNC являются чем-то вроде этого:

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' здесь

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

+1

Пожалуйста, ваш фактический код. У вас конфликтующие объявления, которые не могут означать прототип, неправильный прототип или опечатки. Невозможно рассказать с помощью «псевдокода» – Mat

+1

Это не определения функций. Вам не хватает типов параметров. Является ли это * актуальным * кодом, который вы пытаетесь скомпилировать? –

+0

Можете ли вы скомпилировать 'insert.c' автономно без ошибок? –

ответ

1

Это потому, что вы не объявляете прототипы для своих функций. Функция, которая по умолчанию не имеет прототипа, имеет неизвестный набор аргументов и возвращает 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

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

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

insert_before(arg); 
insert_after(arg); 

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

0

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

0

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

void insert_before(int arg) 
{ 
... 
} 

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

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

отступов является реальной проблемой ... что может быть признаком размещения в SO, но разместить код здесь также больше читаемый, если он имеет отступы.

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

Смежные вопросы