2012-05-15 79 views
1

我目前有一段代碼,我正在使用函數指針作爲回調。我無法從具有誤差GCC聲明「指定參數`類型名稱存儲類「」代碼的相關部分是:C函數指針爲參數`類型名稱'指定錯誤存儲類

error_t addCommand(uint8_t command, void (*callback)(uint16_t,uint8_t)){ 

這實際上是使用基於TinyOS的nesC的語言,但它似乎是一個C問題。在我對這個問題的研究,我發現的建議大多是制止從一兩個問題:

  1. 一些錯誤的標題(缺少分號)
  2. 傳遞函數指針與靜態或揮發性值(即0​​

據我可以告訴我已經消除了問題1,問題2只有當uint16_tuint8_t是靜態的揮發性(我沒有與這些類型的很多經驗)的問題。任何提示/如何回答爲了解決這個問題,我們非常感謝

此外,如果任何人都熟悉的nesC確切的代碼看起來更像是這樣的:

command error_t CommandEngine.addCommand(uint8_t command, 
             void (*callback)(uint16_t,uint8_t)) { 

它可能什麼nesC中也加入到了C語言會導致這個錯誤,但我不認爲這是案子。

編輯:這是nesC,在某種程度上。事實證明,我是一個笨蛋,並且在命令被nesC使用時將命令用作變量名,並在編譯之前轉換爲一些C代碼塊。感謝大家把它轉換成C代碼的想法,因爲這讓我意識到了這個問題。我真的應該想到這一點。

+0

void(* callback)(uint16_t,uint8_t) - 它不只是一種類型嗎?在函數定義期間,我們不應該有一個參數名嗎? – Jay

+0

另一個存儲類是'extern',所以看看是否有'extern'沒有正確使用的情況。 – acraig5075

回答

0

對函數指針使用typedef通常很好。它可以解決您的問題,一定會更可讀:

typedef void (*callback_t)(uint16_t,uint8_t); 
error_t addCommand(uint8_t command, callback_t callback)){ 

如果不解決這個問題,它至少會縮小它 - 你會看到,如果問題是typedef的或功能。

你也應該試着弄清楚它是否是nesC(我什麼都不知道)或者C.試着去掉nesC特定的部分並用gcc編譯,看看會發生什麼。

+0

雖然其他評論也提到了這一點,但刪除nesC特定部分使我意識到我已經在nesC(command)中使用了一個保留字作爲函數參數名稱。在被髮送到gcc編譯器之前,這已經擴展到一些C塊中。謝謝。 –