Я пытаюсь использовать указатель на функцию в своем коде, код такой, как показано ниже.
#include <stdio.h>
#include <pthread.h>
typedef void (*PFUNC)(int);
typedef struct tag_FUNC_INFO_S
{
PFUNC callback;
int index;
} FUNC_INFO_S;
PFUNC callback_print(int index)
{
printf("[callback] index = %d\n", index);
return NULL;
}
void thread_test(FUNC_INFO_S *info)
{
info->callback(info->index);
pthread_exit(NULL);
}
int main()
{
pthread_t tid;
FUNC_INFO_S info;
info.callback = callback_print;
info.index = 777;
pthread_create(&tid, NULL, (void *)thread_test, &info);
printf("main printing\n");
return 0;
}
После компиляции кода с помощью «gcc -Wall xxx.c -o xxx -lpthread» компилятор сообщает следующее сообщение:
func_ptr_test.c: 30: 16: предупреждение: несовместимые типы указателей, назначаемые для 'PFUNC' (aka 'void () (int)') из 'PFUNC (int)' (aka 'void ( (int )) (int) '[-Wincompatible-указатели-типы] info.callback = callback_print;
Но если я изменю код с
info.callback = callback_print;
to
info.callback = (PFUNC)callback_print;
Предупреждающее сообщение больше не появляется. Но, даже без приведения типов, я думаю, что «info.callback» имеет тот же тип, что и «callback_print», поэтому мне интересно, почему появляется предупреждающее сообщение. Кто-нибудь знает об этом?
PFUNC callback_print(int index)
- ›void callback_print(int index)
- person Christian Gibbons   schedule 02.07.2018void * functionName( void *)
Функции ваших потоков не имеют этого синтаксиса - person user3629249   schedule 03.07.2018main()
отсутствует оператор (ы):int *status = NULL; pthread_join( tid, &status );
- person user3629249   schedule 03.07.2018thread_test()
должны быть:void *thread_test( void *param) { FUNC_INFO_S info = *( FUNC_INFO*)param;
- person user3629249   schedule 03.07.2018gcc -Wall xxx.c -o xxx -lpthread
наgcc -Wall -Wextra -Wconversion -pedantic -std=gnu11 xxx.c -o xxx -lpthread
- person user3629249   schedule 03.07.2018