Chinaunix首页 | 论坛 | 博客
  • 博客访问: 832506
  • 博文数量: 330
  • 博客积分: 9641
  • 博客等级: 中将
  • 技术积分: 3181
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
文章分类

全部博文(330)

文章存档

2012年(17)

2011年(135)

2010年(85)

2009年(57)

2008年(36)

我的朋友

分类: C/C++

2010-06-08 22:38:44

struct sockaddr_in {
short int sin_family; /*   地址族   */  
unsigned short int sin_port; /*   端口号 NBO  */  
struct in_addr sin_addr; /*   Internet地址 NBO  */  
unsigned char sin_zero[8]; /*   与struct   sockaddr一样的长度   */  
}; 

struct sockaddr_in local = {0};
与数组的初始化一样,local的所有成员都被初始化为0
错误!下面转载:

  (一)

       最近项目小组在去除代码中的warning,在修正代码的过程中看到了对结构体不正确的初始化方式:
假设有一个如下的struct定义:

struct   astruct
{
    int   a;
    int   b;
};
struct   astruct   test={0};

即使astruct中都是基础类型的成员这样的初始化话也是不正确的。
这种初始化仅仅是把a变量设置为了0,而未对b变量做初始化。
产生这样错误的原因,大概是收到数组初始化的影响。数组是可以这么初始化话的,而且初始化的值只能是0!
对结构体的初始化,可以有一下三种。

struct   test
{
    int   a;
    int   b;
};
int  main()
{
    struct   test   t1={0,0}; 
    struct   test   t2=
        .a=2
        .b=3
    };  
    struct  test   t3=
        a:12345,
        b:567890
    };  
    printf(“t1.a = %d, t1.b = %d\n”, t1.a, t1.b);
    printf(“t2.a = %d, t2.b = %d\n”, t2.a, t2.b);
    printf(“t3.a = %d, t3.b = %d\n”, t3.a, t3.b);
    return  0;
}

第一种使我们最常见的方式,2,3种方式应该是C99所支持的,但是在微软的编译器中不支持C99,所以才会给人以只有GCC支持的错觉。第一种方式尽量少写。在生成汇编代码时,会消耗掉非常多的时钟周期。

(二)

          驱动内核模块是不需要实现每个函数的。像视频卡的驱动就不需要从目录的结构 中读取数据。那么,相对应的file_operations重的项
就为 NULL。gcc还有一个方便使用这种结构体的扩展。你会在较现代的驱动内核模块中见到。 新的使用这种结构体的方式如下:
struct   file_operations   fops = {
        read: device_read,
        write: device_write,
        open: device_open,
        release: device_release
};
   
同样也有C99语法的使用该结构体的方法,并且它比GNU扩展更受推荐。我使用的版本为 2.95为了方便那些想移植你的代码的人,你最好使用这种语法。它将提高代码的兼容性:
struct   file_operations   fops = {
        .read = device_read,
        .write = device_write,
        .open = device_open,
        .release = device_release
};

(三)

#include
struct   date
{
    int   year;
    int   month;
    int   day;
};
void   main()
{
    //struct date time_1={time_1.year=2008,time_1.month=2,time_1.day=12}; //2008-2-12
    //struct date time_1={time_1.year=2008,time_1.day=12,time_1.month=2}; //2008-2-2
    //struct date time_1={time_1.month=2,time_1.year=2008,time_1.day=12}; //2008-2008-12
    //struct date time_1={time_1.month=2,time_1.day=12,time_1.year=2008}; //2008-12-2008
    //struct date time_1={time_1.day=12,time_1.year=2008,time_1.month=2}; //2008-2-2
    //struct date time_1={time_1.day=12,time_1.month=2,time_1.year=2008}; //2008-2-2008
    printf("%d-%d-%d\n",time_1.year,time_1.month,time_1.day);
}


用此种方式时,struct date time_1={time_1.year=2008,time_1.day=12,time_1.month=2};//2008-2-2
其初始化顺序不能调..

阅读(852) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~