2017-05-05 117 views
1

在C语言中,使用Cortex uC的IAR编译器。假设你有这样三个功能:C:返回枚举函数的函数指针

Type_enum_1 get_parameter_alpha(void); 
Type_enum_2 get_parameter_beta(void); 
Type_enum_3 get_parameter_gamma(void); 

我想知道这是否是可能的声明可以被分配到上述每个功能的函数指针。

uint8_t (*getter_ptr)(void) 

void (*getter_ptr)(void) 

,但没办法,编译器接受分配

getter_ptr = get_parameter_alpha 

是否有这样的解决方案:我已经尝试使用?

感谢

+3

在每种情况下,我只能说“如果你去了,只有痛苦会找到。” –

+1

对于3种不同的枚举类型,您不能使用1。您将面临警告或错误。 – tilz0R

+0

@ tilz0R我会试试。但我应该如何声明getter_ptr使其工作? – nutello84

回答

4

的返回类型是函数签名的一部分,因此与不治疗枚举拖泥带水,你将不能只要申报,涵盖所有三个函数的函数指针类型为Type_enum_1编译器,Type_enum_2Type_enum_3并不完全相同。

你可以做什么,但是,是利用一个事实,即enum s为根本不同的方式来看待一个整数,所以作为一种解决方法,你可以实现三个代理功能

int get_parameter_alpha_proxy(void) { return (int)get_parameter_alpha(); } 
int get_parameter_beta_proxy(void) { return (int)get_parameter_beta(); } 
int get_parameter_gamma_proxy(void) { return (int)get_parameter_gamma(); } 

这三个可将分配给int (*getter_ptr)(void)类型的点 - 但是,如果所涉及的三个枚举具有重叠/不明确的值(其大部分时间都是这种情况),则返回的整数值的解释将不是直接的。

+0

是的,这可能是一个很好的解决方法,谢谢 – nutello84

1

如果你的函数返回不同的类型,为每个类型声明不同的typedefs

Type_enum_1 get_parameter_alpha(void); 
Type_enum_2 get_parameter_beta(void); 
Type_enum_3 get_parameter_gamma(void); 

类型定义:

typedef Type_enum_1 (*enum_1_ptr)(void); 
typedef Type_enum_2 (*enum_2_ptr)(void); 
typedef Type_enum_3 (*enum_3_ptr)(void); 

申报函数指针:

enum_1_ptr e1ptr = get_parameter_alpha; 
enum_2_ptr e2ptr = get_parameter_beta; 
enum_3_ptr e3ptr = get_parameter_gamma; 

打电话给他们时,你需要:

Type_enum_1 res1 = e1ptr(); 
Type_enum_2 res2 = e2ptr(); 
Type_enum_3 res3 = e3ptr(); 
+0

谢谢,但这不能帮助我。你声明了三个函数指针,但是我想只用一个函数来指定我所有的getter函数 – nutello84

+0

我明白了你的观点。那么选项就是在我之前用代理作为答案。请记住,那么你必须非常小心地投射和解释你期待的结果。就像'void *'问题,你不知道你得到了什么类型的数据。小心! – tilz0R

0

您将必须实现的通用某种方式继承模型,例如:

typedef union 
{ 
    Type_enum_1 e1; 
    Type_enum_2 e2; 
    Type_enum_3 e3; 
} Type_enum_t; 

typedef Type_enum_t type_enum_func_t (void); 

然后根据这个模板声明函数。

Type_enum_t get_parameter_alpha(void); 
Type_enum_t get_parameter_beta(void); 
Type_enum_t get_parameter_gamma(void); 

他们仍然会通过设置联合的正确成员来返回自己的特定类型。

然后,您可以声明一个函数指针这样的:

如果要声明一个函数指针类型可以从三个不同的枚举返回不同的值,如果没有提示哪个返回枚举
type_enum_func_t* fptr = get_parameter_alpha;