簡體   English   中英

C ++函數指針語法

[英]C++ function pointer syntax

我知道通常,函數指針聲明如下:

 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中使用,例如:通常它是typedef OLDNAME NEWNAME ,只是使用函數指針,這是一種奇怪的由內而外的語法,其中新名稱實際上在中間整個表達。 更不用說返回函數指針的函數的符號了......

不為我編譯。 AFAIK它不是有效的C ++。

不過你可以偽造它!

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

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

或者使用boost::function (或std::function )之類的東西來獲得終極勝利。

這不是一個聲明,它是一個callback演員,然后分配給。

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

我更喜歡使用typedef我的函數指針,並且還沒有遇到問題。

如果我理解正確的話,Typedef不會將新類型作為另一個的別名(這就是為什么size_tunsigned int可以互換使用而不需要編譯器投訴)。 因此,對於經常使用的函數指針類型,typedef使它們更容易使用。

對於函數指針typedef,語法為:

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

在內部使用所需的類型名稱(與您現在正在進行的操作沒有太大區別)。 您可以指定大多數函數修飾符(__stdcall,__ declspec等),它們只是在* name之前的括號內。

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

暫無
暫無

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

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