2015-12-22 1 views
5

私はこのオープンソースのブートローダを見ていましたが、私はこのコード行を見ました。最後の行で何が起こっていますか?それはアドレスへのキャストを伴う関数へのポインタのようなものでしょうか?このCグループのキャストはなんですか?

uint8_t ret = init_api(); 
    uint16_t ptr; 
    ptr = PGM_READ_WORD(JUMP_TABLE_INDEX(6)); 

    ret = ((uint8_t(*)(uint32_t, uint8_t *, uint8_t)) ptr)(addr, data, erase); 
+2

狂気??これはCです! –

答えて

14

ptr関数へのポインタ

uint8_t f(uint32_t, uint8_t *, uint8_t) 

にキャストされ、関数がパラメータaddrdataeraseで呼び出されます。

+3

また、JUMP_TABLE_INDEXマクロで参照されるジャンプテーブルは、関数ポインタの配列である可能性が高いので、マクロがアドレスを返し、上記コードの最後の行が実際にジャンプテーブルの6番目の要素によって参照される関数を呼び出します。 – bruceg

+0

このような場合は、関数のポインタ型をtypedefし、その型に 'ptr'をキャストする方が読みやすくなります。 – Jerry101

関連する問題