2010-08-09 70 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