请教看不懂的宏定义

dsoyy 2012-05-08 10:07:56

#define u8 unsigned char

#define MC_PCC_FILL_STRUCT1 u8:0;u8:8;u8:0;
#define MC_PCC_FILL_STRUCT2 u8:0;u8:8;u8:8;u8:0;
#define MC_PCC_FILL_STRUCT3 u8:0;u8:8;u8:8;u8:8;u8:0;

下面的三条宏,在结果题里面出现过,这样的定义不知道该怎么样去理解。
...全文
190 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsoyy 2012-05-23
  • 打赏
  • 举报
回复
字对齐,结贴。
Fangzhen 2012-05-10
  • 打赏
  • 举报
回复
这个应该是结构体中使用位域的问题
Athenacle_ 2012-05-08
  • 打赏
  • 举报
回复
位域,妥妥的。
但0个位的位域编译不过
孤独小剑 2012-05-08
  • 打赏
  • 举报
回复
结构体字节对齐用的,
typedef struct {
struct {
u8 v_ClirSelect;
u8 v_SemicolonFound:1;
MC_PCC_FILL_STRUCT2
} s_Flags;
中MC_PCC_FILL_STRUCT2为#define MC_PCC_FILL_STRUCT2 u8:0;u8:8;u8:8;u8:0;
u8:0是为了上填充上一个字节剩余位,如果没有剩余位则不填充。比如这里MC_PCC_FILL_STRUCT2的第一个u8:0就填充了7位,这样组合起来就是4字节对齐了。

t_aki_ParamList a_ParamList[AKI_PARAM_LENGTH];
ascii a_Command[AKI_CMD_LENGTH];
u16 v_ParserLocalIndex;
u8 v_ExtendedCommand;
u8 v_CommandType;
u8 v_NumberOfParam;
u8 v_IsAbortableCommand;
MC_PCC_FILL_STRUCT2 //?????类似这样的写法出现了,我猜也是位定义,但是起到什么作用了?
}t_aki_DecodedCommand;
这里t_aki_ParamList a_ParamList[AKI_PARAM_LENGTH];
ascii a_Command[AKI_CMD_LENGTH];应该都是4字节对齐了。
接着就是一个u16四个u8,所以还需要填充2个字节来4字节对齐。
所以用MC_PCC_FILL_STRUCT2来填充对齐。

感觉这种对齐的方法风格不好。
nice_cxf 2012-05-08
  • 打赏
  • 举报
回复
大概是为了字节对齐填充没用字节用的,分别填充1-3个字节
proorck6 2012-05-08
  • 打赏
  • 举报
回复
这代码结构性不是很好,别跟它学,小心学坏了。
自信男孩 2012-05-08
  • 打赏
  • 举报
回复
u8 v_SemicolonFound:1这个说明v_SemicolonFound占了一位,该变量取两个值:0或者1;
dsoyy 2012-05-08
  • 打赏
  • 举报
回复
还是举个实际一点的例子来说:
typedef struct {
struct {
u8 v_ClirSelect;
u8 v_SemicolonFound:1;
MC_PCC_FILL_STRUCT2
} s_Flags;
t_aki_ParamList a_ParamList[AKI_PARAM_LENGTH];
ascii a_Command[AKI_CMD_LENGTH];
u16 v_ParserLocalIndex;
u8 v_ExtendedCommand;
u8 v_CommandType;
u8 v_NumberOfParam;
u8 v_IsAbortableCommand;
MC_PCC_FILL_STRUCT2 //?????类似这样的写法出现了,我猜也是位定义,但是起到什么作用了?
}t_aki_DecodedCommand;
dsoyy 2012-05-08
  • 打赏
  • 举报
回复
还是举个实际一点的例子来说:
typedef struct {
struct {
u8 v_ClirSelect;
u8 v_SemicolonFound:1;
MC_PCC_FILL_STRUCT2
} s_Flags;
t_aki_ParamList a_ParamList[AKI_PARAM_LENGTH];
ascii a_Command[AKI_CMD_LENGTH];
u16 v_ParserLocalIndex;
u8 v_ExtendedCommand;
u8 v_CommandType;
u8 v_NumberOfParam;
u8 v_IsAbortableCommand;
MC_PCC_FILL_STRUCT2 //?????类似这样的写法出现了,我猜也是位定义,但是起到什么作用了?
}t_aki_DecodedCommand;
ouyh12345 2012-05-08
  • 打赏
  • 举报
回复
貌似在结构或类里,使用位
W170532934 2012-05-08
  • 打赏
  • 举报
回复
其实宏定义就是在预处理期间进行字符串的替换而已。我觉得这个定义的是一串数据,估计是某些结构体的值而已。
赵4老师 2012-05-08
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。
夏天__ 2012-05-08
  • 打赏
  • 举报
回复
直接在程序里面的 替换而已。。

相当于起个别名。

使用起来比较方便罢了。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧