1

現在、コールバックとして関数ポインターを使用して作業しているコードがあります。「パラメータ`typename'に指定されたストレージクラス」というgccのエラーで問題が発生しました。コードの関連部分は次のとおりです。

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

これは実際にはTinyOSにnesC言語を使用していますが、Cの問題のようです。この問題に関する私の調査では、主に2つの問題のいずれかに起因する提案を見つけました。

  1. ヘッダーに問題があります(セミコロンがありません)
  2. 静的または揮発性の値を持つ関数ポインタを渡す(つまり、void (*callback)(volatile int, uint8_t)

私が知る限り、問題1を排除しました。問題2は、揮発性の場合uint16_tまたはuint8_t静的である場合にのみ問題になります(これらのタイプの経験はあまりありません)。この問題を解決するためのヒント/回答をいただければ幸いです。

また、nesCに精通している場合、正確なコードは次のようになります。

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

nesCがC言語に追加しているものがこのエラーを引き起こす可能性がありますが、そうではないと思います。

編集:ある意味、それはnesCでした。私はバカで、コマンドがnesCによって使用され、コンパイル前にCコードのブロックに変換されたときに、変数名としてコマンドを使用していたことがわかりました。問題に気づいたので、Cコードに変換することを考えてくれてありがとう。私は本当にこれを考えるべきだった。

4

1 に答える 1

0

一般に、関数ポインタにはtypedefを使用することをお勧めします。それはあなたの問題を解決するかもしれません、そして確かにはるかに読みやすくなります:

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

問題が解決しない場合は、少なくとも問題を絞り込みます。問題がtypedefにあるのか、関数にあるのかがわかります。

また、それがnesC(私は何も知らない)なのかCなのかを理解する必要があります。nesC固有の部分を削除してgccでコンパイルし、何が起こるかを確認してください。

于 2012-05-15T06:52:42.923 に答える