簡體   English   中英

void *函數指針數組轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM