[英]void* function pointer array cast
我有一個看起來像這樣的數組:
void* functions[]; // pointer to functions, each function returns an int and has int parameters A and B
我想把它投入以下內容:
int (*F)(int a, int b) = ((CAST HERE) functions)[0];
int result = F(a, b);
我已經嘗試了“(int(*)(int,int))”作為轉換但編譯器抱怨我試圖將函數指針用作數組。
它將有助於為函數類型使用typedef:
typedef int F_type(int, int);
然后你可以寫:
F_type *F = (F_type *)(functions[0]);
在使用索引運算符之前嘗試將functions
為其他內容將是未定義的行為(嚴格別名違例)。
請注意,標准C不支持將void *
轉換為函數指針。 如果可能的話,首先使數組成為函數指針:
F_type *functions[] = { &func1, &func2 };
NB。 有些人更喜歡使用typedef作為函數指針類型,而不是函數類型。 我認為這樣可以避免使用指針類型設置更可讀的代碼,但我提到這一點,以便您可以理解其他建議。
使用(int (**)(int, int))
似乎現在可以做到,但是它會調用未定義的行為 !
將void*
轉換為函數指針不是標准C.
請注意,將void*
別名void*
不同的類型; 嚴格的別名違規。 閱讀更多內容函數指針void的效果是什么?
請考慮從一開始就使用一組函數指針。
function
是一個指向void
類型數據的指針數組。 您希望將它轉換為指向int (*)(int, int)
類型的指針的指針,這些指針將是int (**)(int, int)
,因此以下工作原理:
int (*F)(int, int) = ((int (**)(int, int)) functions)[0];
正如@MM所指出的,上面會導致未定義的行為 。 你可能會想讀這個職位和這個要了解他們。
理想情況下,你會做這樣的事情:
// Array of 2 pointers to functions that return int and takes 2 ints
int (*functions[2])(int, int) = {&foo, &bar};
// a pointer to function
int (*F)(int, int) = functions[0];
int r = F(3, 4);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.