GCC代码移植到Keil遇到的问题

本文详细探讨了从GCC编译器移植到Keil编译器时遇到的对齐问题,包括类型定义和指针操作的差异,并提供了在Keil环境下解决这些问题的方法,特别关注了强制类型转换和指针加法操作的不同实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要从GCC下的代码移植到Keil下,发现对齐这边编译无法通过,原来他们是不兼容的,需要做些修改:

<span style="font-size:14px;">//Keil下 
typedef __packed union { 
  uint16_t W; 
  __packed struct { 
    uint8_t L; 
    uint8_t H; 
  } WB; 
} WORD_BYTE; 


//GCC下 
struct _WB{ 
    uint8_t L; 
    uint8_t H; 
}__attribute__ ((packed)); 


typedef union _WORD_BYTE WORD_BYTE; 
union _WORD_BYTE{ 
    uint16_t W; 
    struct _WB WB; 
}__attribute__ ((packed)); </span>
GCC不支持左值强制类型运算(这点不敢肯定)
<span style="font-size:14px;">//Keil 
(uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength; 

//GCC 
 pD =  ( USB_COMMON_DESCRIPTOR *)((uint8_t *)pD + ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength);</span>
GCC无法做对齐强制类型,以下为keil的方式,GCC下做类似动作是不生效的,问题描述里详细介绍

*((__packed uint32_t *)pData) = *((__packed uint32_t *)dataptr); 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值