中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
有关结构,看不懂
作者:未知 时间:2005-09-13 19:18 出处:ChinaUnix.net 责编:chinaitpower
              摘要:有关结构,看不懂

[code:1:2bb9bc8b7c]
struct proto_ops unix_stream_ops = {
        family:         PF_UNIX,

        release:        unix_release,
        bind:           unix_bind,
        connect:        unix_stream_connect,
        socketpair:     unix_socketpair,
        accept:         unix_accept,
        getname:        unix_getname,
        poll:           unix_poll,
        ioctl:          unix_ioctl,
        listen:         unix_listen,
        shutdown:       unix_shutdown,
        setsockopt:     sock_no_setsockopt,
        getsockopt:     sock_no_getsockopt,
        sendmsg:        unix_stream_sendmsg,
        recvmsg:        unix_stream_recvmsg,
        mmap:           sock_no_mmap,
        sendpage:       sock_no_sendpage,
};

struct proto_ops unix_dgram_ops = {
        family:         PF_UNIX,

        release:        unix_release,
        bind:           unix_bind,
        connect:        unix_dgram_connect,
        socketpair:     unix_socketpair,
        accept:         sock_no_accept,
        getname:        unix_getname,
        poll:           datagram_poll,
        ioctl:          unix_ioctl,
        listen:         sock_no_listen,
        shutdown:       unix_shutdown,
        setsockopt:     sock_no_setsockopt,
        getsockopt:     sock_no_getsockopt,
        sendmsg:        unix_dgram_sendmsg,
        recvmsg:        unix_dgram_recvmsg,
        mmap:           sock_no_mmap,
        sendpage:       sock_no_sendpage,
};
[/code:1:2bb9bc8b7c]
出自linux内核代码,有关socket的内容/usr/src/linux-2.4/net/unix/af_unix.c
不知道这里的“:”是什么意思,以及为什么后面用“,”.

 无双 回复于:2003-02-28 09:19:53
是不是表示是位数

c语言中一个结构中每个字段占一位是什么写了我忘记了

 无双 回复于:2003-02-28 09:25:30
与位结构的表示方法不一样
楼主还是自己写个代码看看

看它的sizeof是多少

以下是位结构的定义 
  
    二、位结构 
    位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构 
比按位运算符更加方便。 
    位结构定义的一般形式为: 
[code:1:9cd329a911]
     struct位结构名{ 
          数据类型 变量名: 整型常数; 
          数据类型 变量名: 整型常数; 
     } 位结构变量; 
[/code:1:9cd329a911]
    其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整 
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。 
    变量名是选择项, 可以不命名, 这样规定是为了排列需要。 
    例如: 下面定义了一个位结构。 
[code:1:9cd329a911]
     struct{ 
          unsigned incon: 8;  /*incon占用低字节的0~7共8位*/ 
          unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/ 
          unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/ 
          unsigned blink: 1;  /*blink占用高字节的第7位*/ 
     }ch; 
[/code:1:9cd329a911]
    位结构成员的访问与结构成员的访问相同。 
    例如: 访问上例位结构中的bgcolor成员可写成: 
      ch.bgcolor 
  
    注意: 
    1. 位结构中的成员可以定义为unsigned, 也可定义为signed,  但当成员长 
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。 
    2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 
如果是指针, 其成员访问方式同结构指针。 
    3. 位结构总长度(位数), 是各个位成员定义的位数之和,  可以超过两个字 
节。 
    4. 位结构成员可以与其它结构成员一起使用。 
    例如: 
[code:1:9cd329a911]
     struct info{ 
          char name[8]; 
          int age; 
          struct addr address; 
          float pay; 
          unsigned state: 1; 
          unsigned pay: 1; 
          }workers;' 
[/code:1:9cd329a911]
    上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结 
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工 
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。 
  
[/code]

 flw 回复于:2003-02-28 09:25:35
(本次发言由于存在错误,所以已经作废)

 menp9999 回复于:2003-02-28 09:34:58
[quote:1a5eeccd38="bombbaby"]出自linux内核代码,有关socket的内容/usr/src/linux-2.4/net/unix/af_unix.c
不知道这里的“:”是什么意思,以及为什么后面用“,”.[/quote:1a5eeccd38]
这是初始话,实际上是赋值.

 bombbaby 回复于:2003-02-28 09:37:01
[quote:700359a4f0="flw"]这是“位域”,学过 C 的都应该知道。[/quote:700359a4f0]

请教一下,到底是什么意思?

 无双 回复于:2003-02-28 09:37:02
对了

看的时候没有看到是定义变量
以为是定义结构呢

 menp9999 回复于:2003-02-28 09:37:52
[quote:c810efa227="bombbaby"]出自linux内核代码,有关socket的内容/usr/src/linux-2.4/net/unix/af_unix.c
不知道这里的“:”是什么意思,以及为什么后面用“,”.[/quote:c810efa227]
不是很明显么?
proto_ops 是数据类型,
unix_stream_ops 这个结构是变量.
在后面的就是为结构的成员进行赋值.GNU/C的扩充用法.
这样的例子在LINUX内核比比皆是.

 bombbaby 回复于:2003-02-28 09:54:17
收到,谢谢楼上的。开始还以为事定义结构呢! ops:  ops:  ops:

 menp9999 回复于:2003-02-28 14:39:29
[quote:6df8a4de54="bombbaby"]不过还有个问题,就是为什么最后也有一个“,”。 
后面的应该是一个函数,那么是不是就是说前面的等价于后面的函数?[/quote:6df8a4de54]
不是,前面的只是个指针,指针的内容是用来存储后面的涵数的地址的.其实前面的并不是涵数.
你说的最后要个.的问题,我确实回答不出来,也许为了是GNU/C的语法定义规则有规律简单一点的缘故吧,每一项都一样.

 bombbaby 回复于:2003-02-28 14:14:10
不过还有个问题,就是为什么最后也有一个“,”。 
后面的应该是一个函数,那么是不是就是说前面的等价于后面的函数?

 zhxlanjuan 回复于:2003-03-01 14:56:15
关于最后那一个,的确是为了规律性的作用,因为这样就使结构体很有规律,方便编译器的编译,特别是当一个结构体很大的时候,这样做比较有用,c陷阱与缺陷提到了这一点;

在多的我也不知道了^_^

 无双 回复于:2003-02-28 16:35:52
这是不是标准C中的语法
还是只是GCC的扩展


如果是GCC扩展的话
可能表示其它元素不指定的意思

 menp9999 回复于:2003-02-28 16:41:02
[quote:725d55da83="无双"]这是不是标准C中的语法
还是只是GCC的扩展


如果是GCC扩展的话
可能表示其它元素不指定的意思[/quote:725d55da83]
其他元素默认是NULL.
这样的结构里的成员并不是每个都要用到的.

 menp9999 回复于:2003-03-01 11:12:07
[quote:cfc6b0d821="flw"](本次发言由于存在错误,所以已经作废)[/quote:cfc6b0d821]
你这么做是干什么?谁没有错误呀?高手和低手的差别不过是谁的错误多一点谁的错误少一点而已.这么搞的以后大家都不敢发言了.我个人以为:无论对错,问问题还是答问题都是都我的水平提高有极大的帮助.

 menp9999 回复于:2003-03-01 16:03:38
[quote:5df6c7b123="zhxlanjuan"]关于最后那一个,的确是为了规律性的作用,因为这样就使结构体很有规律,方便编译器的编译,特别是当一个结构体很大的时候,这样做比较有用,c陷阱与缺陷提到了这一点;

在多的我也不知道了^_^[/quote:5df6c7b123]
哈哈,我又猜对了.我是从语法规则上来推测的.譬如要是不,号,语法规则肯定要比加,号复杂.

 雷斯林 回复于:2003-03-01 19:47:19
冒号前的表示结构的成员名,
冒号后的表示给该成员所赋的值,
最后的逗号表示后面还有几个成员没有赋明确的值(将被初始化为0)

 menp9999 回复于:2003-03-02 15:59:18
[quote:7ea438851e="雷斯林"]冒号前的表示结构的成员名,
冒号后的表示给该成员所赋的值,
最后的逗号表示后面还有几个成员没有赋明确的值(将被初始化为0)[/quote:7ea438851e]
最后的豆号是这个意思?不可能,因为有可能是中间的几个成员不被副值呢?
典型的以FILE_OPRETOR结构为例子,并不是只是后面的几个成员不被副值呀.

 雷斯林 回复于:2003-03-03 09:15:00
中间的成员可以省略,是因为对每一个我们要初始化的成员我们都把它的名字给写了出来,编译器自然可以知道如何去对应。

 menp9999 回复于:2003-03-03 10:25:06
[quote:cfd144f333="雷斯林"]中间的成员可以省略,是因为对每一个我们要初始化的成员我们都把它的名字给写了出来,编译器自然可以知道如何去对应。[/quote:cfd144f333]
从语法上来讲,加不加逗号都不改变本来的语义,所以不加也是可以的,所以我推测的是为了使语法规则简单而加一个逗号.安照你的意思,不加逗号编译器就不能识别,其实不加逗号,只要修改语法规则的话,照样可以识别,支部语法规则要复杂一点而已.

 雷斯林 回复于:2003-03-03 12:28:17
同意menp9999的看法,不过我也没说不加逗号编译器就报错啊

 menp9999 回复于:2003-03-03 12:31:57
[quote:6350e1c34c="雷斯林"]同意menp9999的看法,不过我也没说不加逗号编译器就报错啊[/quote:6350e1c34c]
编译器应该是报错的吧?如果不加的话.

 雷斯林 回复于:2003-03-04 19:12:39
我试过了,最后一个逗号可以不加,中间的必须加。
我用的IDE是Tornado

 menp9999 回复于:2003-03-05 08:56:01
[quote:a04df868fe="雷斯林"]我试过了,最后一个逗号可以不加,中间的必须加。
我用的IDE是Tornado[/quote:a04df868fe]
不足以证明,如果你想要试试的话,你可以直接在LINUX的内核的代码里试一下.你说的环境我没有见过,但是我个人是这样推测的:他能识别不加最后一个逗号的文法.或者说他是另外加了一些语法规则.因为从语义上说,结合下文是不存在二义性的,但是你肯定要多加一条语法规则.
另外请你把在LINUX下的结果写出来,我编译碰到了空难.好麻烦的.

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有