2011-04-25 94 views
3

完成noob到C,剛剛開始有些蠢蠢欲動,想知道如何(讀取「if」)以下是可能的。函數指針和指針參數在C

嘗試創建一個struct,其成員是一個函數指針,並且函數指針指向一個函數,該函數採用與上述struct相同類型的參數。例如(介意的語法,剛開始熟悉這裏):

typedef struct{ 
    void (*myStructFunc)(void); 
} MyStructType; 

void myFunc(void){ 
    printf("Hello world!"); 
} 

// ... 

MyStructType myStruct; 
myStruct.myStructFunc = &myFunc; 
myStruct.myStructFunc(); // <= Hello world! 

工作正常,但是當我嘗試將MyStructType類型的參數介紹的功能:

typedef struct{ 
    void (*myStructFunc)(*MyStructType); // <= parse error 
} MyStructType; 

void myFunc(MyStructType *myStruct){ 
    printf("Hello world!"); 
} 

// ... 

MyStructType myStruct; 
myStruct.myStructFunc = &myFunc; 
myStruct.myStructFunc(&myStruct); 

這些例子由於顯而易見的原因是簡短的,但它們說明了我的意圖。再次,只是讓我的腳溼C所以請原諒任何語法上的無知。

反正我怎麼能做到這一點?很顯然,我在語法上做了一些不正確的事情,或者我試圖做一些明顯不可能的事情。

另請注意,這是純粹的學術原因。

+0

P.S.玩得開心實施面向對象。 ;) – 2011-04-25 03:36:22

回答

2

解析錯誤是從*MyStructType來了,這似乎是一個錯字,你已經正確申報的實際功能定義的結構指針。

修復仍然是一個錯誤,因爲在struct定義時,typedef未生效。

typedef struct { 
    node *next; // error - what is a node? 
    void *data; 
} node; // this is where node is defined 

爲了解決這個問題,你需要使用一個名爲struct:同樣的問題可以用一個鏈表來說明(更清晰恕我直言)

struct node { 
    struct node *next; 
    void *data; 
}; 

或將typedef第一,然後再定義在(命名)struct

typedef struct node node; 

struct node { 
    node *next; 
    void *data; 
}; 

或者(如果你感到討厭)只使用一個void *指針:

typedef struct { 
    void *next; 
    void *data; 
} node; 

這同樣適用於您的情況。

+0

**感謝Chris Lutz; **非常感謝,因爲我剛剛讀到'C'中的鏈接列表實現中,所以您的答案現在和以後都是現貨:)要說*** StackOverflow * + C *編程:現代方法***必須是學習'C'的最佳方式。 – Dan 2011-04-25 03:41:49

5

在第二個示例中,名稱MyStructType未在聲明函數時定義。此外,你有*在錯誤的地方。你需要做類似如下的內容:

typedef struct MyStruct { 
    void (*myStructFunc)(struct MyStruct *); 
} MyStructType; 
+4

因爲你的例子有效,所以你可以把'// <= parse error'去掉。 – 2011-04-25 03:29:17

+0

哎呀,謝謝。得到它了。 – 2011-04-25 03:31:01

+0

**感謝lacqui; **同時發現;給你+1,但與**克里斯**去了額外的信息。 – Dan 2011-04-25 03:43:12

2

嘗試:

struct MyStructType { 
    void (*myStructFunc)(struct MyStructType*); 
}; 

代替。在C中,結構體在它們自己的命名空間中,所以如果你想引用一個結構體,你需要在struct前加上名字。你的typedef直到之後才被引用,這是一個錯誤。如果你還想要typedef,你可以這樣做:

typedef MyStructType MyStructType_t;