结构体的申明及使用及问题,有难度,大家都来看看
在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;
没做任何变化
而这个形式是错的,当然编译不过