2010-08-09 66 views
0

下面的代碼有什麼問題?
下面的parseCounter1()和parseCounter1()是兩個函數。
我把自己的三分球const OptionValueStruct使
他們可以因此,當option_values的每個元素[]
通過了被稱爲:如何調用指向typedef中定義的函數的指針struct

typedef struct OptionValueStruct{ 
    char counter_name[OPTION_LINE_SIZE]; 
    int* counter_func; 
} OptionValueStruct_t; 

const OptionValueStruct option_values[] = {  
    {"Counter1", (*parseCounter1)(char*, char**)}, 
    {"Counter2", (*parseCounter2)(char*, char**)}, 
    }; 

const OptionValueStruct *option = NULL; 

for(int i = 0; i< sizeof(option_values)/sizeof(OptionValueStruct_t); i++){ 
    option = option_values + i ; 
    result = option->counter_func(opt_name, opt_val); 
} 

回答

7

你已經宣佈你counter_func成員是一個指向int ,而不是函數指針,而在option values中有類似於函數指針聲明的內容。這裏有你想要的(假設你的返回類型爲INT)

typedef struct OptionValueStruct{ 
    char counter_name[OPTION_LINE_SIZE]; 
    int (*counter_func)(char*, char**); 
} OptionValueStruct_t; 

const OptionValueStruct_t option_values[] = { 
    {"Counter1", parseCounter1}, 
    {"Counter2", parseCounter2}, 
}; 

for(int i = 0; i< sizeof(option_values)/sizeof(OptionValueStruct_t); i++){ 
    result = option_values[i]->counter_func(opt_name, opt_val); 
    // don't know what you relly want to do with result further on.. 
} 
+0

非常感謝您的回答 – user399517 2010-08-10 05:00:04

+0

在int(* counter_func)(char *,char **)的末尾冒號(而不是分號)是否是拼寫錯誤?或者一些特殊的語法? – Nathan 2017-03-10 01:18:18

+0

不,這是一個錯字 – nos 2017-03-10 09:28:48

0

如果你(作爲標籤建議)編譯的C代碼,那麼你應該的option_values[]option的類型更改爲OptionValueStruct_t。然而,在C++中,這是可以的。

或者,您可以從自定義類型名稱中刪除尾部_t

+0

感謝您的答案。 option_values []的類型已經是OptionValueStruct_t和 選項的類型是OptionValueStruct_t *。正如我在 顯示的原帖。 你的意思是我應該使用struct OptionValueStruct {...}, 然後使用聲明struct OptionValueStruct option_value []? – user399517 2010-08-10 05:18:16

+0

@ lilili08 - 在寫這篇評論的時候,兩個變量的類型是'const OptionValueStruct',而不是'const OptionValueStruct_t'。然而,'OptionValueStruct'是struct定義的**標籤**,而不是自定義類型的名稱(在'typedef'語句中)。在C中,struct標記不是新類型。但在C++中,它是。現在,標籤和自定義類型名稱可以相同,因此您可以從'typedef'語句中移除'_t'字符,並將新定義的類型設置爲'OptionValueStruct',以便您可以在更多變量聲明中使用它。 – ysap 2010-08-10 13:17:42

+0

@ lilili08 - 如果您使用的是Visual C++,那麼編譯很可能是以C++代碼的形式完成的,因此編譯器不會對此發出警告。您可以將'Project Properties' /'Configuration Properties' /'C/C++'/'Advanced' /'Compile As'更改爲'編譯爲C代碼',以確保您符合C標準。 – ysap 2010-08-10 13:22:45