6

私が使用しているコードには、次のステートメントがあります。

typedef void  ( udp_data_notify )(OS_FIFO * pfifo, WORD port); 

これは、udp_data_notify の関数ポインタの宣言のように見えますが、ありません*。アスタリスクなしで関数ポインタにすることはできますか?

を使用するステートメントを次に示しますudp_data_notify

void RegisterUDPFifoWithNotify( WORD dp, OS_FIFO *pnewfifo , udp_data_notify * nudp)

何が起こっているかについての助けをいただければ幸いです!

4

3 に答える 3

6

次のような typedef:

typedef void name(int);

(括弧nameは冗長です) はname、関数ポインターではなく、関数の型として定義されます。それは次のようになります。

typedef void (*pname)(int);

あなたはおそらく彼らが何のために良いのか疑問に思っています. 関数型は、ポインターを宣言する場合を除いて、あまり役に立ちません。

name *pointer_to_function;

そして、それは間違いなく他の typedef でより読みやすくすることができます:

pname pointer_to_function;

これは、関数型の変数を定義できないためです。試してみると、単純に関数のプロトタイプを記述できますが、かなり難読化された構文になります。

name foo;   //declaration (prototype), not variable
void foo(int x) //definition
{
}

ただし、typedef を使用して関数を定義することはできないことに注意してください。

name foo {} //syntax error!
于 2013-07-28T23:48:40.737 に答える
0

あなたが示しているのは、関数型のエイリアスであるとtypedef宣言しています。udp_data_notify次に、パラメーター宣言は、その型の関数へのポインターであることをudp_data_notify *nudp宣言します。nudpここには関数呼び出しはありません。

関数呼び出し演算子 (後置()) に関しては、呼び出される関数を指定する式は、関数へのポインターでなければなりません。などのポインターを使用せずに関数を通常どおり呼び出すと、sqrt(2)関数は自動的にポインターに変換されます。sqrt(2)実際そうです(&sqrt)(2)。ポインターを使用して関数を呼び出す場合、呼び出しは既に正しい形式になっています。

于 2013-07-28T23:41:53.883 に答える