簡體   English   中英

正確的方法來定義函數的指針

[英]right way to define pointer to the function

大家好,我有這段代碼:

void foo(int var, int var1)
{
 printf("%d\n", var);
 printf("%d\n", var1);
}

void foo_for_foo( void (*some_function)(int, int))
{
 int x = 5;
 some_function(x, x);
}

int main()
{
 void (*ptr_foo);  // <- look here
 ptr_foo = &foo;
 foo_for_foo(ptr_foo);

 return 0;
}

如何定義函數指針是否重要:

1) void (*ptr_foo);
2) void (*ptr_foo)(int, int);

我的編譯器收到兩個版本

提前感謝解釋差異

這兩種形式並不相同。

void (*ptr_foo)根本不是函數指針。 這是一個普通的非函數void指針。 括號是多余的和誤導性的。 就像你寫了void* ptr_foo

void (*ptr_foo)(int, int)是聲明一個函數指針的正確方法,該函數指向一個帶有兩個int並返回void的函數。

這種方法的唯一原因是因為在C中, void指針可以隱式轉換為任何其他類型的指針。 也就是說,您可以將任何其他指針指定給void* ,並且可以為任何其他指針指定void*

但是這個在這個例子中起作用的事實本質上是語法的意外。 你通常不能用void (*foo)(int, int)替換void (*foo)(int, int) void (*foo)

如果你嘗試將參數列表中的some_function用於foo_for_foo ,那么當你嘗試調用some_function時,編譯器會抱怨,因為它不是函數指針。

同樣,如果你的foo函數碰巧返回int而不是void ,你會立即注意到這個問題。 ptr_foo聲明為int (*ptr_foo)會導致語句ptr_foo = &foo出錯,因為與void指針不同, int指針不能隱式轉換為其他指針類型。

簡而言之, 始終使用第二種形式 盡管存在這種不穩定的情況,但它是唯一一個正確的。

聲明void (*ptr_foo); 聲明void *類型的變量。 函數指針在語句ptr_foo = &foo;轉換為此類型ptr_foo = &foo; 並返回到foo_for_foo調用中指向正確函數指針類型的指針。 如果使用gcc -Wall (或編譯器支持的任何額外偏執設置)進行編譯,您應該會看到有關此轉換的警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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