Понимание случая обратного вызова в C - PullRequest
1 голос
/ 14 июля 2011

Я хочу понять, что на самом деле означает этот код, особеннопоследняя часть, где функция заключена в фигурные скобки.Является ли функция broadcast_open каким-либо образом вызывающей функцию broadcast_recv?Если да, то как?

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); 
} 

Ответы [ 2 ]

3 голосов
/ 14 июля 2011

Кажется, что broadcast_callbacks - это структура, определенная примерно так:

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

Тогда линия

static const struct broadcast_callbacks broadcast_call = {broadcast_recv};

создает новый объект структуры, член которого указывает на функцию broadcast_recv. Этот член теперь можно использовать для вызова broadcast_recv (что, вероятно, является частью того, что делает broadcast_open).

0 голосов
/ 14 июля 2011

Вы, вероятно, видели инициализированные простые переменные, например ::100100

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
};

Кто-то теперь может звонить f() с (*a_t_instance.f)() или даже a_t_instance.f()

Так что да, broadcast_open или что-то, что он вызывает, вероятно, вызывает broadcast_receive,, используя указатель в структуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...