[英]C : why is that cast of void function to "pointer to function returning pointer to pointer to void" possible
#include <stdio.h>
void hello() {
printf("hello world\n");
}
int main() {
void *(*gibberish)() = (void *(*)())hello;
(*gibberish)();
void (*simple)() = &hello;
(*simple)();
return 0;
}
$ cc pt_func.c && ./a.out
hello world
hello world
嗨,c 中指向 function 的指針讓我很困惑。 第二個定義(簡單)非常清楚:我們獲取 hello 的地址,並將其放入我們可以使用的指向 function 的指針中。
但是,第一個對我來說有點奇怪。 為什么它有效? 如何將 void function 轉換為指向 function 的指針,返回指向 void 的指針?
編譯器如何處理這樣的轉換?
首先,當 function 指示符(包括 function 名稱,例如hello
)用於表達式而不是sizeof
或一元&
的操作數時,它會自動轉換為指向 function 的指針,根據 C 2018 6.3.2.1 4. 所以,在void (*simple)() = &hello;
, &
不需要; void (*simple)() = hello;
將自動使用 function 的地址。這解釋了為什么在void *(*gibberish)() = (void *(*)())hello;
中不需要&
的原因; .
其次,強制轉換是因為 C 6.3.2.3 8 表示
指向一種類型的 function 的指針可以轉換為指向另一種類型的 function 的指針,然后再轉換回來; 結果應與原始指針相比較……
但是,此轉換旨在允許將 function 指針臨時轉換為通用類型,以便可以存儲它。 檢索指針時,應將其轉換回適當的類型,然后再使用它調用 function。第 8 段繼續:
…如果轉換后的指針用於調用類型與引用類型不兼容的 function,則行為未定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.