以下是我试图理解的.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);
?
答案 0 :(得分: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);
调用函数指针指向的函数。
答案 1 :(得分:1)
sizeof(table)/sizeof(handler_t)
:sizeof(table)
是“表”的大小,以位为单位,因此该表是handler_t
的数组,sizeof(table) / sizeof(handler_t)
给出了元素的数量这个表,因而是索引的最大值。
table[i].handler(argc, argv, sockfd)
:这是对函数的调用,正如您所看到的,handler是一个以argc
,argv
和sockfd
为参数的函数。
答案 2 :(得分:0)
sizeof(table) / sizeof(handler_t) // gives number of elements in the array 'table'