2011-10-21 125 views
1

這是一個相當簡單的問題,讓我有點好奇。考慮下面的代碼片段:函數和函數指針之間的區別作爲參數

#include <iostream> 

int three() 
{ 
    return 3; 
} 

void foo(int func(void)) 
{ 
    std::cout << func() << std::endl; 
} 

void bar(int (*func)(void)) 
{ 
    std::cout << func() << std::endl; 
} 

int main() 
{ 
    foo(three); 
    bar(three); 
    return 0; 
} 

// output: 
// 3 
// 3 

正如你所看到的,我們有兩個函數將另一個函數作爲它們唯一的參數。但是,它們的函數原型是不同的。主要有void foo(int func(void))void bar(int (*func)(void))。乍一看,它看起來像foo正在使用該函數本身,而bar正在指向一個函數。

但是,它們都產生完全相同的結果,並且具有完全相同的主體,並且以完全相同的方式調用。

我的問題是,在foobar之間是否存在實際隱藏的區別?這只是C++中的可選語法嗎?在C++中,兩種情況之一被認爲是「不良風格」嗎?

如果我的編譯器是一個因素,我使用Visual Studio 2010中

+0

它與[tag:visual-studio-2010]無關。 – overcoder

+0

@overcoder:刪除標籤。 :) – Zeenobit

回答

9

沒有區別:該類型的foobar是相同的:int(int(*)())

函數型參數沒有這樣的功能:當參數與函數類型語法一起出現(如)時,它將被轉換爲相應的指針函數類型(如int (*func)(void))。

該轉換與用數組語法聲明的參數(例如int a[])如何轉換爲相應的指針類型(int* a)類似。