2016-09-20 6 views
0

Как переслать функцию, которая имеет функцию в качестве параметра в C?Как переслать объявить функцию, которая принимает указатель на функцию в качестве параметра?

Вот функция:

void start_thread (void* function (void*)) { 

    ... 

} 

Я попытался вперед объявить его как:

void start_thread (void*); 

, а также:

void start_thread (void* (void*)); 

и:

void start_thread (void*, void*); 

Ни один из них не был принят. Каков правильный день для объявления объявления для этой функции?

Edit:

void start_thread (void (*) (void*)); 

Урожайность:

Compilation error 
prog.c: At top level: 
prog.c:135:6: error: conflicting types for 'start_thread' 
void start_thread (void* function (void*)) { 
    ^
prog.c:25:6: note: previous declaration of 'start_thread' was here 
void start_thread (void (*) (void *)); 
    ^
+3

'недействительным (*) (* аннулируются)'. Остальное можно найти в книге C по вашему выбору. – Olaf

+0

Что сказал Олаф. Если вы хотите указать имя для этой функции (для целей документации): 'void (* functionName) (void *);' Вы были почти там chodobaggins, только отсутствовали один набор скобок. –

+0

typedef - ваш друг, и это мой любимый ответ на аналогичный вопрос. Http://stackoverflow.com/questions/1591361/understanding-typedefs-for-function-pointers-in-c – user3528438

ответ

-1

Правильный упреждающее объявление/прототип будет:

void start_thread(void*(void*); 
+0

Похоже, вы забыли исправить раннее или более позднее объявление в коде, который вы пытаетесь скомпилировать, после того, как вы получили правильный прототип из комментарий и два ответа. См.: [** Как создать минимальный, полный и проверенный пример **] (http://stackoverflow.com/help/mcve). " –

+0

На самом деле это неверно, эти ответы были неверными, ответ, который я опубликовал, тот, который правильно компилируется. –

+0

синтаксическая ошибка ... – Pierre

0

Используйте технику стеклоочистителя (слева направо-налево ...):

Это указатель, так что есть *. По функции, так (*).

возвращение void, так, void (*).

Это займет void*, так void (*)(void*)

Прототип void start_thread(void (*)(void*));

+0

Ошибка компиляции prog.c: At верхний уровень: prog.c: 135: 6: ошибка: конфликтующие типы для 'start_thread' void start_thread (void * function (void *)) { ^ prog.c: 25: 6: note: предыдущая декларация 'start_thread' была здесь void start_thread (void (*) (void *)); –

+0

Существует дополнительный '*' (или вы пропустили '*') в возвращаемом типе – Pierre

0

Для определения функции у вас есть:

void start_thread (void* function (void*)) { 

Аргумент - это функция, которая принимает параметр void * как параметр и возвращает void *. Чтобы быть более ясным об определении, оно должно быть:

void start_thread (void *(*function)(void*)) { 

Так что заявление должно быть:

void start_thread (void *(*)(void*));