2014-10-23 2 views
0

У нас есть структураАргументы функции в C Структура

typedef struct _disis_thinkgear 
{ 
    t_object x_obj; 

    //other members and such 

, и мы должны иметь элемент в структуре функция как

void (*handleDataValue)(???? , unsigned char extendedCodeLevel, 
           unsigned char code, unsigned char numBytes, 
           const unsigned char *value, void *customData); 
} t_disis_thinkgear; 

Как можно ???? заменить так, чтобы х был первым аргументом? Для использования в качестве

x->handleDataValue = //another function 

ответ

2

Вам нужно переслать, объявить ЬурейеЕ:

typedef struct _disis_thinkgear t_disis_thinkgear; 

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

struct _disis_thinkgear { 
    ... 

    void (*handleDataValue)(t_disis_thinkgear *x, ... 
}; 

После того как вы У вас есть объект такого типа, вы бы назвали его функцией:

t_disis_thinkgear *x = ... 
x->handleDataValue(x, ...); 
+0

вы не можете просто написать что-то вроде 'ничтожной (* handleDataValue) (STRUCT _disis_thinkgear * х, ...' внутри структура? –

+1

@AlexReinking Вы можете, но вперед объявить лучше, потому что тогда вы не должны использоваться в специальных случаях типа внутри структуры. –

+0

@AlexReinking Кроме того, некоторые компиляторы выдают тип, записанный в сообщениях об ошибках. Наличие 't_disis_thinkgear' появляется в сообщениях об ошибках, вероятно, будет предпочтительнее видеть struct _disis_thinkgear'. – duskwuff

1

Это полный пример, который работает. Фактически вы можете использовать struct _disis_thinkgearвнутри структуры.

#include <stdlib.h> 
#include <stdio.h> 

typedef struct _disis_thinkgear { 
     // ... other things ... 

     void (*handleDataValue)(struct _disis_thinkgear *); 

     // ... other things ... 
} t_disis_thinkgear; 

void printSomething(t_disis_thinkgear *foo) { 
     printf("argument is %p\n", foo); 
} 

int main() 
{ 
     t_disis_thinkgear *x = malloc(sizeof(x)); 
     x->handleDataValue = &printSomething; 
     x->handleDataValue(x); 
     free(x); 
     return 0; 
} 
+1

Или вы можете напечатать структуру как частичный тип и избежать непоследовательного использования: 'typedef struct _disis_thinkgear t_disis_thinkgear; struct _disis_thinkgear {... void (* handleDataValue) (t_disis_thinkgear *) . ..}; ' –