[英]Function pointer without a name in C
一個普通的函數指針看起來像這樣:
void (*fun_ptr)(void);
但是,我已經看到這種語法用於將某些內容轉換為 void 函數指針:
(void (*)(void *))
如您所見,它沒有名稱,只有(*)
代替名稱。 這是什么意思? 僅用於鑄造嗎?
語法(void (*)(void *))
是一個強制轉換。
轉換的目標類型是一個函數指針,它接受一個void *
類型的參數並返回void
。 類型與此強制轉換匹配的函數的示例是:
void abc(void *param);
void (*)(void *)
是一種類型。 它在概念上類似於int *
。 它也沒有與之關聯的標識符。 void (*foo)(void *)
是具有該類型的變量foo
的聲明。
強制轉換表達式的形式為(<type>)<expr>
。 因此, (void (*)(void *))
可以是強制轉換運算符。
但是,這種形式不限於強制轉換表達式。 它可以在任何類型可以使用的地方使用。 例如,作為函數原型中的參數類型:
void bar(void (*)(void *));
這聲明了一個函數bar
,它將函數指針作為參數。
在 C 中,標准所稱的“類型名稱”(類型轉換中的類型,或 sizeof 的參數)與該類型變量的聲明具有完全相同的形式,只是沒有變量。 變量的聲明反映了它的用途。 在您的情況下,使用指向接收 void 指針並返回 void 的函數的指針,例如
(*f)(p)
,
所以它的聲明是
void (*f)(void *P)
,
(注意p
的嵌套類型聲明!),相應的轉換是
(void (*)(void *))
。
這是一個簡單、強大且合乎邏輯的原則; 但一個結果是,對於復雜類型,變量名出現在聲明的中間,就像在相應的表達式中一樣。
有趣的是,類型名中只有一個變量名的位置(遞歸地應用於函數中的嵌套類型); 類型名稱是明確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.