第一話,先談?wù)剶?shù)組賦值吧。恩,在C語言中數(shù)組賦值和結(jié)構(gòu)體賦值很簡單,就是使用=,memcpy操作嘛.
但最近在看關(guān)于隊列調(diào)度的內(nèi)核實現(xiàn)代碼時,發(fā)現(xiàn)如下奇怪的賦值語句。(具體程序見linux-2.6.8:net/core/Rtnetlink.c的539行)
- #define RTM_MAX (RTM_BASE+47)
- #define RTM_GETLINK (RTM_BASE+2)
- struct rtnetlink_link
- {
- int (*doit)(struct sk_buff *, struct nlmsghdr*, void *attr);
- int (*dumpit)(struct sk_buff *, struct netlink_callback *cb);
- };
- static struct rtnetlink_link link_rtnetlink_table[RTM_MAX-RTM_BASE+1] =
- //RTM_MAX-RTM_BASE+1=48
- {
- [RTM_GETLINK - RTM_BASE] = { .dumpit = rtnetlink_dump_ifinfo },
- [RTM_SETLINK - RTM_BASE] = { .doit = do_setlink },
- [RTM_GETADDR - RTM_BASE] = { .dumpit = rtnetlink_dump_all },
- [RTM_GETROUTE - RTM_BASE] = { .dumpit = rtnetlink_dump_all },
- [RTM_NEWNEIGH - RTM_BASE] = { .doit = neigh_add },
- [RTM_DELNEIGH - RTM_BASE] = { .doit = neigh_delete },
- [RTM_GETNEIGH - RTM_BASE] = { .dumpit = neigh_dump_info }
- };
上面這段賦值語句第一次見到?戳薔久后,我才明白這個賦值語句的含義,原來C語言還可以這樣賦值哦
說明:上面這段賦值語句有兩個需要注意的地方。
1,[RTM_GETLINK - RTM_BASE] = { .dumpit = rtnetlink_dump_ifinfo }, 這條說明C語言在數(shù)組賦值時,可以專門對第幾個元素進行賦值。此例中等于[2]={...},即對第二個元素賦值。
2, { .dumpit = rtnetlink_dump_ifinfo },說明,在結(jié)構(gòu)體賦值中,也可以對某個特定的結(jié)構(gòu)體成員進行單獨的賦值。