[英]function call with different semantics
考慮這個代碼有3個不同的函數調用語義:
void f(void){
puts("OK");
}
int main(void){
f();
(*f)();
(&f)();
return 0;
}
第一種是調用f的標准方式,
第二個是解除引用函數指針的語義,
但在第三個我將&運算符應用於函數名稱,它似乎工作正常。
在第二和第三種情況下會發生什么?
謝謝。
函數調用總是通過函數指針執行。 從C99第6.5.2.2節:
表示被調用函數的表達式應具有指向函數的類型指針。
但是,幾乎在所有情況下,函數類型都會衰減為函數指針類型。 從C99第6.3.2.1節:
除非它是
sizeof
運算符或一元&
運算符的操作數,否則將具有“函數返回類型 ”類型的函數指示符轉換為具有“指向函數返回類型的指針”類型的表達式。
因此,您的三個調用將被評估:
(&f)();
(&(*(&f)))();
(&f)();
一切都有效。 但顯然,第一個( f()
)是最干凈,最容易閱讀的。
在第二種情況下,您正在使用函數指針。 函數指針用於記憶對函數的引用,並且能夠在調用的其他地方調用它。 它們通常用於實現回調。 因此,如果您存儲了指向函數的指針,則應使用第一種表示法。
我認為第一個和第三個是等價的。 實際上,如果您聲明一個函數指針,您可以通過以下方式初始化它:
void AFunction();
void (*funcPtr)() = NULL;
funcPtr = AFunction;
funcPtr = &AFunction;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.