免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4723 | 回复: 8
打印 上一主题 下一主题

[C] 结构用位段赋值问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-20 18:17 |只看该作者 |倒序浏览
结构赋值的时候用位段,这样做有什么好处么?看着晕,不解其意思,望指教。
如:
内核中的:
  1. struct proto_ops {
  2.         int                family;
  3.         struct module        *owner;
  4.         int                (*release)   (struct socket *sock);
  5.         int                (*bind)             (struct socket *sock,
  6.                                       struct sockaddr *myaddr,
  7.                                       int sockaddr_len);
  8.         int                (*connect)   (struct socket *sock,
  9.                                       struct sockaddr *vaddr,
  10.                                       int sockaddr_len, int flags);
  11.         int                (*socketpair)(struct socket *sock1,
  12.                                       struct socket *sock2);
  13.         int                (*accept)    (struct socket *sock,
  14.                                       struct socket *newsock, int flags);
  15.         int                (*getname)   (struct socket *sock,
  16.                                       struct sockaddr *addr,
  17.                                       int *sockaddr_len, int peer);
  18.         unsigned int        (*poll)             (struct file *file, struct socket *sock,
  19.                                       struct poll_table_struct *wait);
  20.         int                (*ioctl)     (struct socket *sock, unsigned int cmd,
  21.                                       unsigned long arg);
  22.         int                 (*compat_ioctl) (struct socket *sock, unsigned int cmd,
  23.                                       unsigned long arg);
  24.         int                (*listen)    (struct socket *sock, int len);
  25.         int                (*shutdown)  (struct socket *sock, int flags);
  26.         int                (*setsockopt)(struct socket *sock, int level,
  27.                                       int optname, char __user *optval, int optlen);
  28.         int                (*getsockopt)(struct socket *sock, int level,
  29.                                       int optname, char __user *optval, int __user *optlen);
  30.         int                (*compat_setsockopt)(struct socket *sock, int level,
  31.                                       int optname, char __user *optval, int optlen);
  32.         int                (*compat_getsockopt)(struct socket *sock, int level,
  33.                                       int optname, char __user *optval, int __user *optlen);
  34.         int                (*sendmsg)   (struct kiocb *iocb, struct socket *sock,
  35.                                       struct msghdr *m, size_t total_len);
  36.         int                (*recvmsg)   (struct kiocb *iocb, struct socket *sock,
  37.                                       struct msghdr *m, size_t total_len,
  38.                                       int flags);
  39.         int                (*mmap)             (struct file *file, struct socket *sock,
  40.                                       struct vm_area_struct * vma);
  41.         ssize_t                (*sendpage)  (struct socket *sock, struct page *page,
  42.                                       int offset, size_t size, int flags);
  43.         ssize_t         (*splice_read)(struct socket *sock,  loff_t *ppos,
  44.                                        struct pipe_inode_info *pipe, size_t len, unsigned int flags);
  45. };
复制代码
这样赋值:
  1. struct proto_ops filter_iocontrol_proto_ops = {
  2.         family:         PF_FILTER_IOCONTROL,
  3.         release:        filter_iocontrol_release,
  4.         ioctl:          filter_iocontrol_ioctl,
  5.         bind:           sock_no_bind,
  6.         connect:        sock_no_connect,
  7.         socketpair:     sock_no_socketpair,
  8.         accept:         sock_no_accept,
  9.         getname:        sock_no_getname,
  10.         poll:           sock_no_poll,
  11.         listen:         sock_no_listen,
  12.         shutdown:       sock_no_shutdown,
  13.         setsockopt:     sock_no_setsockopt,
  14.         getsockopt:     sock_no_getsockopt,
  15.         sendmsg:        sock_no_sendmsg,
  16.         recvmsg:        sock_no_recvmsg,
  17.         mmap:           sock_no_mmap
  18. };
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-10-20 18:51 |只看该作者
其实这不是赋值,而是初始化,这样比原始的方式,更清楚的表明了用什么值初始化了什么。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2011-10-20 19:07 |只看该作者
我靠…… 又是gcc扩展……

论坛徽章:
0
4 [报告]
发表于 2011-10-20 19:20 |只看该作者
我靠…… 又是gcc扩展……
OwnWaterloo 发表于 2011-10-20 19:07



    C99也有了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2011-10-20 19:22 |只看该作者
回复 4# liwangli1983

语法不一样…… 虽然我也觉得gcc的扩展更好看一些……

论坛徽章:
0
6 [报告]
发表于 2011-10-20 19:30 |只看该作者
回复  liwangli1983

语法不一样…… 虽然我也觉得gcc的扩展更好看一些……
OwnWaterloo 发表于 2011-10-20 19:22



    嗯,分得不是太清楚,因为从来没用过……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2011-10-20 19:38 |只看该作者
回复 6# liwangli1983

同样没有实际用过

论坛徽章:
0
8 [报告]
发表于 2011-10-20 19:45 |只看该作者
俺经常这么写,实在很憋屈。

struct proto_ops filter_iocontrol_proto_ops = {
        PF_FILTER_IOCONTROL,  /* family */

论坛徽章:
0
9 [报告]
发表于 2011-10-20 19:47 |只看该作者
书上有介绍啊, c primer plus 最后一章就提到过...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP