2013-12-09 107 views
0

這裏是.c文件的相關片段,我試圖讓感:瞭解C代碼用typedef和結構

背景你讀了段之前:

一個線程是一個套接字上偵聽,一旦它得到一個包。它讀取數據(這是命令的名稱),並根據數據(命令)執行一個操作。

#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

tablehandler_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):這是一個函數調用,正如您所看到的,handler是一個函數,它以argcargvsockfd爲參數。

+0

調用函數指針時,#define扮演什麼角色? –

+1

我認爲'sizeof(table)是字節,而不是位。 – woolstar