假設我有一個指向 function 的指標theFunc
。theFunc
帶有一個指向theFunc
存盤地址的指標。這可能嗎?
使用它看起來像這樣:
funcPtr(funcPtr);
它呼叫由 funcPtr 指向的函式,然后傳遞指標的地址。我不想使用 void 指標,因為我想更改funcPtr
.
uj5u.com熱心網友回復:
您不能簡單地 typedef 一個接受自身作為引數的函式型別。即這樣的事情不會起作用:
/* Will cause a compilation error, MyFuncType used a parameter is not yet defined: */
typedef void(*MyFuncType)(MyFuncType);
但是 - 您仍然可以使用 avoid*
來實作您想要的。typedef 正在使用void*
,但在函式內部,您可以將其轉換為函式指標型別,修改并呼叫它。
看這里:
typedef void(*MyFuncType)(void*);
void f(void* pF)
{
if (pF)
{
MyFuncType ff = (MyFuncType)pF;
/* Change ff here if you need. */
/* Call it: */
ff(0);
}
}
int main()
{
f(f);
return 0;
}
更新:
根據下面@JosephSible-ReinstateMonica 的評論,我添加了第二個解決方案。它不涉及資料和函式指標之間的強制轉換,但在使用自身typedef
呼叫時需要另一個和強制f
轉換:
typedef void(*FuncType1)(void);
typedef void(*MyFuncType)(FuncType1);
void f(MyFuncType pF)
{
if (pF)
{
/* Change pF here if you need. */
/* Call it: */
pF(0);
}
}
int main()
{
f((MyFuncType)f);
return 0;
}
uj5u.com熱心網友回復:
是的。有可能的。C 支持以沒有原型宣告的函式形式的不完整函式型別。例如:
int fun();
宣告一個接受未指定數量的引數并回傳的函式int
。這允許定義接近所需函式型別的函式型別的級聯,該函式型別將指向自身的指標作為第一個引數。所需型別達到無窮大,但 2-3 級足以實作實際型別安全。
例如,即使在迂腐模式下,下面的代碼編譯時也不會發出警告。
int foo(int(int()));
int main(void) {
int (*fptr)(int(int())) = foo;
return fptr(fptr);
}
見https://godbolt.org/z/1s1bGMd9P
uj5u.com熱心網友回復:
theFunc
帶有一個指向theFunc
存盤地址的指標。這可能嗎?
是的,這是可能的,但它也是 100% 沒有意義的。這類似于給自己寫一封信,在信中寫下您的郵政地址。當您已經出現在信中所述的實際地址時,您可以將該信放入您自己的郵箱中。這沒有任何意義——既然你已經在那里,你就已經知道地址了,那么為什么要先寫這封信呢?程式設計中的規則#1:不要僅僅因為你可以就做很奇怪的事情。
C 中的任何函式名在運算式中使用時都可能衰減為函式指標。因此:
void theFunc (void)
{
uintptr_t address = (uintptr_t)theFunc;
}
不需要任何引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480172.html