所以我被告知這些幾乎是相同的
void function1 (void(func)(int), int arg){
func(arg);
}
void function2 (void(*func)(int), int arg){
func(arg);
}
當我執行此操作時,它不會引發任何錯誤。
void print_plus_1(int p)
{
printf("p=%d\n", p 1);
}
void print_plus_2(int p)
{
printf("p=%d\n", p 2);
}
int main(void)
{
function1(print_plus_1, 1);
function2(print_plus_2, 1);
}
但是,當我在結構中初始化相同的 void (func) (int) vs void (*func) (int) 模式時
struct foo
{
void (func1)(int);
void (*func2)(int);
};
void print_plus_1(int p)
{
printf("p=%d\n", p 1);
}
void print_plus_2(int p)
{
printf("p=%d\n", p 2);
}
int main(void)
{
struct foo f;
f.func1 = print_plus_1;
f.func2 = print_plus_2;
return 0;
}
它會引發編譯器錯誤?
error: field 'func1' declared as a function
void (func1)(int);
為什么 void (func)(void) 在撰寫為回呼函式而不是結構內的欄位時可以作業?
uj5u.com熱心網友回復:
名義上,void (func)(int)宣告一個接受一個int并且不回傳任何東西的函式,并void (*func)(int)宣告一個指向這樣一個函式的指標。
在標準基礎 C 中,函式不是物件。它們不能分配給變數、作為引數傳遞或存盤在結構成員中。
但是,C 2018 6.7.6.3 8 說:
將引數宣告為“函式回傳型別”應調整為“指向函式回傳型別的指標”,如 6.3.2.1 中所示。
這意味著,當您將引數宣告為函式時,它會自動更改為將引數宣告為指向函式的指標。C 標準中沒有說在宣告結構成員時進行此調整。這就是為什么您可以名義上(但實際上不是)將函式引數宣告為函式,但不能將結構成員宣告為函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/532223.html
標籤:C
