2013-12-09 3 views
0

Здесь представлены соответствующие фрагменты файла .c я пытаюсь понять:Понимание C код с ЬурейеЕ и структуры

фона, прежде чем читать фрагмент кода:

Нить прослушивания на сокете , как только он получит пакет. Он считывает данные (это имя команды), и в зависимости от данных (команды) выполняется действие.

#define HANDLER(cmd) {#cmd, cmd} 

handler_t table[] = { 
    HANDLER(LOAD), 
    HANDLER(STORE), 
    HANDLER(REMOVE), 
}; 

typedef struct _handler_t 
{ 
    char cmd[CMD_LEN]; 
    void (*handler)(int argc, char *argv[], int sockfd); 
} handler_t; 


for (i = 0; i < sizeof(table)/sizeof(handler_t); i++) 
    if (strcmp(cmd, table[i].cmd) == 0) // where cmd is an array whose content were read from socket 
     table[i].handler(argc, argv, sockfd); 

Почему sizeof(table)/sizeof(handler_t)?

Почему table[i].handler(argc, argv, sockfd);?

ответ

2

table является массивом handler_t, sizeof(table) является размер всего массива, sizeof(handler_t) это размер одного элемента. Таким образом, sizeof(table)/sizeof(handler_t) - это количество элементов массива. Другой более распространенный способ получить его - sizeof(table)/sizeof(table[0]).

handler - это указатель на функцию, поэтому table[i].handler(argc, argv, sockfd); вызывает функцию, указанную указателем функции.

+0

При вызове указателя на функцию, какую роль играет #define? –

+1

@ Myth17 Макрозамена не имеет особой роли в вызове указателя функции, она выполняется во время предварительной обработки, заменяет макросы их значениями (которые не указаны в вопросе), а затем выясните, ясно ли это. –

+0

#define упростил объявление таблицы. – woolstar

0
sizeof(table)/sizeof(handler_t) // gives number of elements in the array 'table' 
1

sizeof(table)/sizeof(handler_t): sizeof(table) это размер «стол» в битах, таким образом, эта таблица представляет собой массив handler_t, sizeof(table)/sizeof(handler_t) дает число элементов в этой таблице, и, следовательно, максимальное значение для индекса.

table[i].handler(argc, argv, sockfd): Это вызов для функции и, как вы можете видеть, обработчик является функция, которая принимает argc, argv и sockfd в качестве параметров.

+0

Когда вы вызываете указатель на функцию, какую роль играет #define? –

+1

Я думаю, что 'sizeof (table) - это байты, а не биты. – woolstar

Смежные вопросы