get_unaligned宏 看不懂 高手请进

njkido 2010-08-18 06:42:13
linux下的一个宏:

#define get_unaligned(ptr) \
({ \
struct __attribute__((packed)) { \
typeof(*(ptr)) __v; \
} *__p = (void *) (ptr); \
__p->__v; \
})

使用:
void func(const void *value)
{
uint8_t temp8;
uint16_t temp16;
uint32_t temp32;
uint64_t temp64;

temp8 = *(uint8_t *) value; //1
temp16 = get_unaligned((uint16_t *) value); //2
temp32 = get_unaligned((uint32_t *) value); //3
temp64 = get_unaligned((uint64_t *) value); //4
}

应该是内存对齐方面的,能否解释一下这个宏?为什么注释1处不需要,而2,3,4处需要?谢谢
...全文
961 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
njkido 2010-08-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

#define bt_get_unaligned(ptr) \
({ \
struct __attribute__((packed)) { \
typeof(*(ptr)) __v; \
} *__p = (void *) (ptr); \
__p->__v; \
})


//type

typedef void TYPE_VOID, *PTYPE_VOID;

typedef unsigned char TYPE_U8, *PTYPE_U8;
typedef unsigned short TYPE_U16, *PTYPE_U16;
typedef unsigned long TYPE_U32, *PTYPE_U32;



typedef signed char TYPE_S8, *PTYPE_S8;
typedef signed short TYPE_S16, *PTYPE_S16;
typedef signed long TYPE_S32, *PTYPE_S32;



main()
{
printf("Hello world !\n");

TYPE_U8 d8 = 0x37;
TYPE_U16 d16 = 0x3419;
TYPE_U32 d32 = 0x98051234;


d16 = *(&d8); //1
d16 = bt_get_unaligned((PTYPE_U16) (&d8));//2

system("pause");
}

用这个程序看了一下,1处对的d16=0x37,2处用了宏倒不对了d16=0xB037,哪边出问题?谢谢
失落的凡凡 2010-08-18
  • 打赏
  • 举报
回复
这里牵扯的东西太多,现在还不是你去需要读懂它的时候。
njkido 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]

把干扰阅读的斜杠去掉,你就明白了……
[/Quote]

您好 能解释的详细点吗?谢谢
jackyjkchen 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tianweishuiguo 的回复:]
看不懂啊,typeof是啥东东
[/Quote]
gcc独有的东东
东大坡居士 2010-08-18
  • 打赏
  • 举报
回复
看不懂啊,typeof是啥东东
jackyjkchen 2010-08-18
  • 打赏
  • 举报
回复
把干扰阅读的斜杠去掉,你就明白了……

69,369

社区成员

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

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