文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C版本差异--- 结构处理差别

C版本差异--- 结构处理差别

时间:2010-03-07  来源:bluedrum

1。关于空结构。    一般的书籍提到sizeof()的结果是1.原因是这样保证结构定义有一个确定的值。参见如下代码

/* Author: Andrew Huang <[email protected]> */
#include <stdio.h>

struct empty_str{
/*    int data; */
};

#define PRINT_INT(e) printf("%s=%d\n",#e,e)
#define PRINT_INTX(e) printf("%s=%x\n",#e,e)

void test1()
{
     struct empty_str str;
     PRINT_INT(sizeof(struct empty_str));
     PRINT_INTX(&str);
}

     在VC++ 6.0 测试 C语言下空结构是编译错误,,用C++编译得出sizeof=1,结果如下
sizeof(struct empty_str)=1
&str=12ff28
  用gcc 编译c语言版本.结果是0,
sizeof(struct empty_str)=0
&str=bfce8dc8
   用g++测试的cpp版本,结果一致  
sizeof(struct empty_str)=1
&str=bfc70557
但是在RHEL 5/GCC 4.12 下测试 sizeof 为0.   2.double 的字节对齐。  这个讲字节对齐都会提到这个差异.在WINDOWS下,double使用8字节对齐,在LINUX使用4字节对齐。    

/* Author: Andrew Huang <bluedrum#163.com> */
#include <stdio.h>

struct empty_str{
    int data;
};

#define PRINT_INT(e) printf("%s=%d\n",#e,e)
#define PRINT_INTX(e) printf("%s=%x\n",#e,e)


struct double_str1{
    short a;
    double b;
    char c;
};

void test2()
{

     PRINT_INT(sizeof(struct double_str1));
    
}


struct double_str1的在Windows下测试的sizeof的值是 24.Linux 下测试sizeof值是16.原因是WIndows 采用8对齐,这样要在a后面补6个byte,c后面补7个bye才能满足8对齐.而Linux是对齐,因此在a后补了2个byte,在c后面补了3个byte.

 

3.标记化结构初始化语法

在标准C中(C89(结构标准初始化是用{}来实始化,在C99的版本,采用了采用可读性更强的标记化实始化,这在LINUX内核和驱动很为常见。

其中VC++ 6.0只支持C89初始化,GCC支持自己标记化或自己扩展初始化。这种初始化采用 .name = value.这样不需要按顺序排序,方便调整实义,在大结构最大程度防止错位的和调整定义带来不便

struct name_str{
 int data;
 char name[120];
 int num;
};
/* 标记式初始化,注意顺序不同,并可缺省 */
struct name_str str ={
  .num = 100;
  .name = "hxy";
  
};

/* C89 初始化 */

struct name_str str2 =
{
 100,"Andrew Huang",-2
};

/* gcc 扩展初始化 */
struct name_str str3 =
{
  name:"bluedrum";
  data:-1
}
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载