2012-07-04 80 views
1

我使用函數指針遇到了兩個不同的代碼。函數指針語法

請告訴我哪個更好?有沒有任何偏好?

typedef int myFunction(int a,int b); 
extern myFunction *ptfunction; 

typedef int (*ptfunction)(int a,int b); 
+0

我會第一次看到,因爲第二次不會編譯。 –

+0

我真的不明白typedef在這裏的需要。不會簡單地聲明int(* ptfunction)(int a,int b);實現與typedef相同嗎?我認爲簡單的聲明更清楚。 (如果你不需要它,編譯器會將它優化掉......) –

+0

如果你編輯了原始文章並添加了兩個工作示例,這將會很有幫助。 – octopusgrabbus

回答

6

兩個都是壞的,因爲它們是語法不正確。

您需要:

typedef int (*myFunction)(int a, int *b); 
+0

第一個是罰款(至少在語法上) - 你可以定義一個函數類型,你不能聲明該類型的對象。 –

0

第一個包含了另一個錯誤:您可以不投INT的指針爲int。哪一個更好?他們都完全沒有背景。

0

對於第一個代碼,您必須在某處定義ptfunction。 和我不認爲第二個代碼可以編譯。

嘗試:

typedef int *PTFUNCTION(int, int); 
PTFUNCTION func = f1; 
func(1, 2); 
1

都不是,使用std::function

std::function<int (int ,int)> ptfunction; 
ptfunction = f1; 

實施例(它在STD中的C++ 0x):

how to use boost bind

std::function

+0

我喜歡使用'std ::: function'的建議,但是根本不需要'std :: bind'。你可以做'ptfunction = f1;' – Flexo

+0

那麼我不確定你能否做到這一點,沒有綁定。 –

+0

你只需要綁定,如果你想做更復雜的事情而不僅僅是前進。 – Flexo

1

第二個是無效的;如果您修復的第一行來聲明一個變量,將等同於第一,不是一個類型:

int (*ptfunction)(int a, int b); 

這是「更好」你想用這些東西做什麼完全取決於。如果你需要多次提到同一類型,那麼typedef會使事情變得更加清晰;如果你只是想像你的例子那樣聲明一個函數指針,那麼它只會增加額外的噪聲。

(據推測,在你的第一個例子中,第二個參數應該是intint*,否則函數調用將不編譯)。

使用函數對象通常更加方便和靈活,特別是,因爲這些可以綁定任意狀態。但這超出了這個問題的範圍。