2015-06-04 150 views
1

我已經初始化了一個帶有函數名的靜態結構,如下所示。用函數指針進行靜態結構初始化

我們必須用常量初始化靜態結構。函數名是C中的常量嗎?

struct fp { 
     int (*fn)(); 
}; 
int f1() 
{ 
     printf("f1 called \n"); 
     return 0; 
} 
static struct fp fps = { 
     .fn = f1, 
}; 
int main() 
{ 
     fps.fn(); 
     return 0; 
} 

如果編譯時沒有任何問題,當初始化結構如下所示。

static struct fp fps = { 
     .fn = &f1, 
}; 

在C的函數名F1和& F1相同?

+1

你會得到什麼錯誤? –

+1

你的問題是什麼?我不明白最後一行。 – moffeltje

+0

他問''func'是否與'func'相同。答案是肯定的,他們是一樣的,選擇你更喜歡的任何一個。看到這裏:http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work – szczurcio

回答

3

f1是函數的名稱。在大多數情況下,當用作表達式時,函數名稱會自動衰減爲指向該函數的指針。沒有發生衰減的一種情況是函數名稱是操作符地址(&)的操作數。作爲評估表達式,f1&f1通常是相同的。

實際上,在的任何函數調用表達式f(args),f是一個指向函數的指針。可以簡單地通過名稱調用函數的原因是由於從函數名稱到函數指針的自動衰減。

你也可以把它和解除引用函數指針。他們會馬上衰減回指針:

int f(void); 

f();   // "f" decays to &f 
(&f)();  // normal call via function pointer, no implicit decay 
(*f)();  // why not 
(*****f)(); // ditto 
+0

感謝您的信息。我最初的懷疑是,如果我編譯下面的程序,那麼它會拋出「初始化元素不是常量」的錯誤,因爲x是一個變量。 struct ex {int a; }; int main(){int x = 4; static struct ex sample = {.a = &x, }; return 0; } 同樣,如果我們在初始化過程中分配函數名稱,那麼它不會拋出任何錯誤。爲什麼? – user3693586

+0

@ user3693586:啊,對。靜態初始化必須是編譯時常量表達式。我想象功能的地址是這樣的(雖然我不知道相關的標準)。 –