2016-02-19 83 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

非常感謝!有用!!!!! –

相關問題