2011-07-13 7 views
1

このコードが実際に意味するものを理解したいと思います。関数が中括弧に入れられる最後の部分。 broadcast_open関数は何とか関数broadcast_recvを呼び出していますか?はいの場合、どうですか?Cのコールバックのケースを理解する

struct broadcast_callbacks 
{ 
    void (*callback)(struct broadcast_conn *, const rimeaddr_t *from); 
}; 

次にライン

static const struct broadcast_callbacks broadcast_call = {broadcast_recv}; 

そのメンバーbroadcast_recv機能へのポイント新しいStructオブジェクトが作成されます。

static void broadcast_recv(struct broadcast_conn *c, const rimeaddr_t *from) 
{ 
    printf("broadcast message received from %d.%d: '%s'\n", 
     from->u8[0], from->u8[1], (char *)packetbuf_dataptr()); 
} 

static const struct broadcast_callbacks broadcast_call = {broadcast_recv}; 
static struct broadcast_conn broadcast; 

PROCESS_THREAD(example_broadcast_process, ev, data) 
{ 

    broadcast_open(&broadcast, 129, &broadcast_call); 

    ... 

} 

void broadcast_open(struct broadcast_conn *c, uint16_t channel, const struct broadcast_callbacks *u) 
{ 
     abc_open(&c->c, channel, &broadcast); 
     c->u = u; 
     channel_set_attributes(channel, attributes); 
} 
+0

こんにちは、返信ありがとうございます。ここでbroadcast_open – Acid

+0

空隙 broadcast_open(構造体broadcast_connの*のC、uint16_tチャネル、 \t CONST構造体broadcast_callbacks * U)を {abc_open(&C-> C、チャネル、およびブロードキャスト)のためのコードです。 c-> u = u; channel_set_attributes(channel、attributes); } – Acid

+0

私が特に知りたいのは、中括弧の構文です...なぜ、どのように使用されたのですか? – Acid

答えて

0

あなたはおそらく、単純な変数が初期化さ見てきた例えば:

int x = 4; 

それは、集約、初期化が終了する場所をコンパイラが知っているので、このような構造として、ブレースが初期化子を中心に使用されているがあります。この場合、関数ポインタは構造体の最初のメンバーであるように見えます。

int f(void) { return 1; } 

struct t { 
    int (*f)(void); 
    int a, b, c; 
    char *d, *e, *f; 
} a_t_instance = { 
    f 
}; 

誰かが今(*a_t_instance.f)()f()を呼び出す、またはすることができさえa_t_instance.f()

そうです、それはおそらく構造にポインタを使用してbroadcast_receive,を呼び出している呼び出しますbroadcast_openか何か。

3

broadcast_callbacksはこのような何かを定義した構造体であると思われます。このメンバーはbroadcast_recv(これはおそらくbroadcast_openの一部です)を呼び出すために使用できるようになりました。

関連する問題