2011-06-09 97 views
0

我有以下代碼。我只想知道代碼最後一行的含義。從結構調用函數

typedef struct Details 
{ 
int D1; 
int D2; 
} Sdetails; 




typedef struct Variable  
{ 
    int Type; 
    Sdetails i; 
}Varialbl3; 


typedef XAN_BOOL (*returnfunction)(variabl3* Data); 


typedef struct _function 
{ 
    returnfunction   fr; 

}function1; 


function1 *f1; 
variabl3 v3; 

f1->fr(&v3); 

什麼是最後一行F1-> FR(& V3)表示?我不明白這個概念。

回答

4

f1是一個指向結構的指針。該結構有一個名爲fr的成員,它是一個指向函數的指針。該函數需要一個指向variabl3的指針並返回XAN_BOOL

因此,f1->fr(&v3)調用f1->fr指向的函數,提供地址v3作爲唯一參數,並忽略返回值。

1

f1是一種指針結構體;該結構的唯一成員是指向函數的指針。最後一行在該結構的一個實例中調用指針保存的函數,並將結構實例的地址作爲函數的參數傳遞。

2

它調用fr函數。

f1是指針function1(這是結構):

typedef struct _function 
{ 
    returnfunction   fr; 
}function1; 

function1具有部件 - 一個指向函數 - 名爲fr。函數,指針由fr有一個參數 - variabl3

// pointer to function, taking one argument with type 
// `variabl3` and returns typedef struct _function 
typedef XAN_BOOL (*returnfunction)(variabl3* Data); 

所以,f1->fr(&v3)電話fr並將v3作爲參數。返回值爲XAN_BOOL,如typedef中所述。


順便說一句,如果這是真正的代碼 - 這是不確定的行爲f1初始化

0

它是一個函數的指針:基本上,你調用一個可以在其他地方設置的抽象函數。

你應該有一個真正的功能類似的地方:

XAN_BOOL realFunction(variabl3* pxData) { return (pxData==0); } 

然後,你可以這樣做:f1->fr = realFunction:你讓你的函數指針指向真正的函數。然後,當你在之後調用f1-> fr時,它會調用realFunction。

這在很多設計模式中被廣泛使用:當你想註冊回調函數,在監聽器/觸發器中,當你想在純C中實現面向對象的設計,當你想要突出UI時例如GTK中按鈕的行爲)。

希望這有助於,如果有什麼不清楚的地方,請在評論中提問,我會編輯。