2017-09-04 90 views
3

TL:DR;當編譯一個曾經是C++的項目時,我得到這個錯誤error: initializing argument 2 of 'int SocketSrv(int, int (*)(), int*, int, int, int)'。該程序在沒有警告的情況下編譯爲C代碼。遷移Ç - > C++函數指針拋出編譯器錯誤

的代碼是:

rtn=SocketSrv(RxServConfig->port_nbr1, fn, &RxDataSocketId, 
      RxServConfig->max_children, 
      RxServConfig->shmemkey, 
      RxServConfig->semkey); 

的問題是,我們給一個指向函數int function (int)給需要int function()的功能。

我甚至不有一個想法,爲什麼這個工作在C和我在被調用函數沒有訪問代碼。

問題:我可以以某種方式投int (*)(int)int (*)()?再次說明「爲什麼這樣做有用?」指向的函數實際上使用參數,即使我們聲明瞭一個沒有參數的函數指針,C是否沿着參數傳遞?

回答

9

在C中,int (*)()指一個指針,它返回int和需要的參數的不特定的多個,在C的函數++這意味着返回int並採取參數的函數,所以這就是爲什麼它在C編譯但它不在C++中。

爲了解決需要更多相關信息,但是你可以簡單地寫有正確的簽名功能的過載,並從內部調用它的其他。

+0

有趣,絕對給了我更多的研究的起點。它在一個塊中調用了分配給函數指針的幾個不同的函數,我必須弄清楚它們是否都具有相同的簽名,然後寫入一個包裝器。我想在C++中不可能有非特定數量的參數?將它改爲void指針會改變事物嗎? – xyious

+0

@xyious你可以嘗試的reinterpret_cast (F),如果你確信傳遞的指針有正確的類型,問題是在調用的函數 –

+0

@xyious也許它可以工作工作,你們有兩個想法的聲明,但記得要小心並避免*未定義的行爲*。 –