2011-04-05 131 views
3

我知道,通常,一個函數指針聲明如下:C++函數指針語法

void __stdcall my_func(int i) {} // for assigning 

void (__stdcall * my_ptr)(int) = &my_func; 

現在我有幾個功能,這需要一個函數指針作爲自己的論據:

void calling_func(void (__stdcall * callback)(int)) { *callback(1); } 

在頭文件,我剛剛刪除的東西的名稱:

void calling_func(void (__stdcall *)(int)); 

和voilá,那工​​作...並得到我上墨:如果這是一個完整的類型聲明,那麼對於函數指針,是否還可以使用正常的TYPE NAME = VALUE語法?

我試圖聲明:

(void (__stdcall *)(int)) callback = &my_func; 

,它還會編譯!爲什麼這不經常使用?這個符號有缺陷嗎?對我來說,它似乎會大大簡化函數指針的使用......例如:在一般情況下,它是typedef OLDNAME NEWNAME,只是函數指針就是這種奇怪的從裏到外的語法,其中新名稱實際上位於整個表達。更不用說功能返回函數指針的符號...

回答

4

這不是一個聲明,它是一個callback,然後分配給。

您確定您沒有預先存在的範圍聲明嗎?

+0

好地方。我無法弄清楚他在那裏做什麼! – 2011-04-05 19:07:23

4

不爲我編譯。 AFAIK它是無效的C++。

雖然你可以僞造它!

template <typename T> 
struct identity { 
    typedef T type; 
}; 

identity<void(*)(int)>::type callback = &my_func; 

或使用的最終勝利像boost::function(或std::function)。

+0

酷!這是一個很好的代碼 – 2011-04-05 19:05:59

+0

@Felix:謝謝! – 2011-04-05 19:07:43

1

我更喜歡typedef我的函數指針,並沒有問題。如果我的理解正確的話,Typedef並沒有把另一個新類型作爲另一個類型的別名(這就是爲什麼size_tunsigned int可以在沒有編譯器投訴的情況下互換使用)的原因。因此,對於經常使用的函數指針類型,typedefs使它們更易於使用。

對於函數指針的typedef,語法雲:

typedef IObject * (*CreateFunc)(int, Core *); 

在裏面(沒有多大你現在在做什麼不同的)所需的類型名稱。你可以指定大多數函數修飾符(__stdcall,__declspec等),它們只在* name之前的括號內。

您可以輕鬆調用,分配和獲取這些值,並將它們轉換爲void *以便傳遞(類型未知時)。