2016-02-19 84 views
-1

我想通过按下调用的函数my_function按钮:为什么在通过指针调用函数时会收到错误?

该按钮结构的元件:

struct newtComponent_struct { 
    ... 

    newtCallback callback; 
    void * callbackData; 

    ... 

    void * data; 
}; 

哪里newtCallback callback

typedef void (*newtCallback)(newtComponent, void *); 

newtComponent is: 
typedef struct newtComponent_struct * newtComponent; 

因此我这样做:

button->callback = my_function; 

当创建my_function是:

void my_function (newtComponent co, void* data) 
{ 
    printf ("Hello world\n"); 
} 

按钮的处理程序是这样做的:

if(button->callback) button->callback(button, button->callbackData); 

不幸的是,我得到的错误:

"Pointer to incomplete class type is not allowed" 
button->callback = my_function; 

我在做什么错?

+0

您的'typedef'是否在结构定义之前? –

+0

告诉我们'按钮'是如何声明的? –

+1

什么是'newtComponent'定义为? – owacoder

回答

1

我想问题是你有一种“循环参考”。如果您首先声明newtCallback,则未定义参数newtComponent。如果您首先声明该结构,则newtCallback未定义。

为了避免这种行为的,试试这个:

int main(){ 
    newtComponent button; 
    button.callback = my_function; 
    if(button.callback) button.callback(button, button.callbackData); 
    return 0; 
} 

似乎很好地工作:

#include <stdio.h> 

struct newtComponent_struct; // declaration first 
typedef struct newtComponent_struct newtComponent; 
typedef void (*newtCallback)(newtComponent, void *); 

struct newtComponent_struct { 
    newtCallback callback; 
    void * callbackData; 
    void * data; 
}; 


void my_function (newtComponent co, void* data) 
{ 
    printf ("Hello world\n"); 
} 

我测试。

+0

非常感谢!有用!!!!! –

相关问题