首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

结构体的申明及使用及有关问题,有难度,大家都来看看

2012-03-17 
结构体的申明及使用及问题,有难度,大家都来看看在C语言中,我们在定义结构体时,通常用typedef关键字,这样在

结构体的申明及使用及问题,有难度,大家都来看看
在C语言中,我们在定义结构体时,通常用typedef关键字,这样在定义变量时就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候特别有用。
声明1:
struct   T_STR1
{
      int   ilength;
      char   *   pData;
};

声明2:
typedef   struct   tag_STR
{
      int   ilength;
      char   *   pData;
}   T_STR;
注:tag_STR可以省略


定义:
struct   T_STR1   t2;
  T_STR   t1;

而在研究模块代码中,却发现了这样一个结构体定义,该定义不规范但可以成功骗过编译器编译成功,从代码上看该定义应该是有意而为之,不解其中含义,大家可以看看。

#if   !defined(WIN32)  
#define   tag_STR     _attribute__((packed))
#else
#define   tag_STR
#endif  

typedef   struct{
      int   ilength;
      char   *   pData;
}   tag_STR     T_STR;

注:不清楚_attribute__((packed))是宏还是函数

可以看到,这段代码针对不同的操作系统设置了编译条件,在VxWork系统中可以通过#define   tag_STR使编译器编译成功,去掉此句后报错。那么现在的问题是
1.   为什么加入#define   tag_STR会编译成功。
2.   此种定义方法对程序有何作用。
欢迎大家讨论,谢谢!

[解决办法]
_attribute__((packed))的意思:
在编译过程中不进行对齐的优化,而是按照实际占用的字节数进行对齐。

如果不是WIN32系统下:
typedef struct{
int ilength;
char * pData;
}_attribute__((packed)) T_STR;
[解决办法]
1. 为什么加入#define tag_STR会编译成功。
-------------------------------------------
如果你在非win32环境下没有加入#define tag_STR;那么
} tag_STR T_STR;
这个tag_STR 就是定义的一种类型!而且与已定义宏tag_STR冲突,而且既是不冲突,你看tag_STR T_STR;中间也没有 ", "
[解决办法]
1. 为什么加入#define tag_STR会编译成功。

---------

1) 在加入 #define tag_STR 的时候

typedef struct{
int ilength;
char * pData;
} tag_STR T_STR;

经过宏替换后就是

typedef struct{
int ilength;
char * pData;
}_attribute__((packed)) T_STR;

这个当然可以编译成功,

_attribute__((packed))

这个的意思是

取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。


2)在不加入 #define tag_STR 的时候

typedef struct{
int ilength;
char * pData;
} tag_STR T_STR;

没做任何变化

而这个形式是错的,当然编译不过

热点排行