【发布时间】:2021-03-04 11:20:08
【问题描述】:
使用以前的 gcc 编译器,我们这样做了:
#define DO_PRAGMA(x) _Pragma(#x)
#define PACK_ON(n) DO_PRAGMA(pack(n))
所以实际上意味着 PACK_ON(2) 将扩展为 _Pragma(pack(2)) 然后我们就这样使用它
PACK_ON(2)
typedef struct{
...
};
然而,IAR 编译器想要这样的东西:_Pragma("pack(2)") 因此,我尝试通过以下非编译方式实现 pack 宏:
#define DO_PRAGMA(x) _Pragma(#x)
#define PACK_ON(n) DO_PRAGMA(" ## "pack(#n)"" ## ")
#define PACK_ON(n) DO_PRAGMA(" ## pack(#n) ## ")
#define PACK_ON(n) DO_PRAGMA(" ## #pack(n) ## ")
#define PACK_ON(n) DO_PRAGMA(" ## #pack(n) ## ")
#define PACK_ON(n) DO_PRAGMA("pack(n)")
#define PACK_ON(n) DO_PRAGMA("pack(#n)")
#define PACK_ON(n) DO_PRAGMA(pack(#n))
#define PACK_ON(n) DO_PRAGMA(pack(n))
#define PACK_ON(n) DO_PRAGMA(#pack(#n))
#define PACK_ON(n) \#if (n == 1)\ _Pragma("pack(1)")
#define PACK_ON(n) _Pragma("pack( ## #n ## )")
#define PACK_ON(n) _Pragma("pack( ## n ## )")
#define PACK_ON(n) _Pragma("pack(n)")
#define PACK_ON(n) _Pragma("pack(#n)")
有没有人有一个宏可以与 IAR 编译器一起使用来打包各种大小的 n ? 如果不是,我将强制所有内容打包大小 1 并手动更改使用 2 和 4 的结构。
临时解决方案: 我已经设法通过这样做来解决这个问题:
#define PACK_ON(n) _Pragma("pack(1)")
并手动更改 PACK_ON(2) 和 PACK_ON(4) 的一小部分
【问题讨论】:
-
有什么原因你不能直接使用标准 C
#pragma,然后是 IAR 想要的任何东西? -
我刚刚阅读了一些 ARM 的随机 IAR 手册,它声称支持
#pragma pack(n),与 gcc、clang 等一样,事实证明。那你为什么不能用它呢? -
您原来的 gcc 宏扩展为
_Pragma("pack(2)"),这正是 gcc 想要的。由于 IAR 应该支持 C99,因此格式相同。我发布了一个答案,请检查它是否也适用于 IAR。 -
"实际上意味着 PACK_ON(2) 将扩展为 _Pragma(pack(2))" 不,它将扩展为
_Pragma("pack(2)"),因为#x.我在 EWARM 8.50.4 上进行了测试,它工作正常:PACK_ON(2) struct A { char a; int b; }的大小为 6 个字节。 -
@Lundin 它有效,我在 GCC 上得到的结果与你相同:
3和4。
标签: c macros pragma iar pragma-pack