2013-10-05 2 views
-1

Я пишу программу pthread, которая содержит функции, приведенные ниже, и я хочу вызвать другую функцию между одной функцией.Как использовать указатель функции в C?

void *fun1(void *arg1) 
{ 
fun2(NULL); 
} 
void *fun2(void *arg) 
{ 
fun1(NULL); 
} 

Когда я звоню другую функцию, как показано выше, я получаю сообщение об ошибке, как показано ниже

ошибки: конфликтующие типов для «fun2»

примечания: предыдущее неявного объявление «fun2» здесь

Как я могу позвонить fun2 в fun1 между

+0

Зачем ставить C в заголовок вопроса, а затем пометить его C++? Удалено это для вас –

+0

Тем более, что это другая ошибка в C++, чем в C ... – abarnert

ответ

6

Declare:

void *fun2(void *);

перед тем fun1

компилятор предполагает, тип возвращаемого по умолчанию, как int, так что вы должны сказать ему, фактический прототип перед использованием

+2

Также ему нужно вернуть указатель из функции, которая должна возвращать указатель. –

2
/* forward declaration */ 
void *fun2(void *arg); 

void *fun1(void *arg1) 
{ 
    fun2(NULL); 
} 
void *fun2(void *arg) 
{ 
    fun1(NULL); 
} 

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

4

Во время компиляции вы не дали прототип fun2 как:

void * fun2(void *); 

Поскольку нет опережающего объявления, следовательно, компилятор неявно предполагает, что он будет возвращать int. (Я имею в виду, что так работает мой компилятор). Таким образом, он будет иметь конфликтующие типы.

Лучшая практика:

void * fun1(void *); 
void * fun2(void *); 

void * fun1(void *arg1) 
{ 
    fun2(NULL); 
    //return missing 
} 
void * fun2(void *arg) 
{ 
    fun1(NULL); 
    //return missing 
} 
2

Вы должны объявить функцию перед вызовом it.keep привычки объявления функций в заголовочном файле или верхней части файла .c. Вы должны

void *fun2(void *args); 
2

Позволяет перейти на дикую природу и предположить, что вы использовали форвардные декларации.

fun1 (есть неправильно) не вызывает fun2 то, что вызывает fun1, что вызывает fun2 до бесконечности - до благословенных машины пробегов стеки и отдает (терпение?).

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