簡體   English   中英

具有不同語義的函數調用

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

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