簡體   English   中英

C:為什么可以將 void function 轉換為“指向 function 的指針,返回指向 void 的指針”

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

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