2017-05-05 113 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;