如何解决用于使用 IAR 编译器内联函数的 C 宏
使用以前的 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)
解决方法
鉴于编译器支持 pack(1)
、push
和 pop
编译指示,那么这个标准的 C 解决方案是有效的:
#include <stdio.h>
#define DO_PRAGMA(x) _Pragma(#x)
#define PACK_ON(n) _Pragma("pack(push)") DO_PRAGMA(pack(n))
#define PACK_OFF _Pragma("pack(pop)")
PACK_ON(1)
typedef struct
{
char c;
short s;
} foo;
PACK_OFF
typedef struct
{
char c;
short s;
} bar;
int main()
{
printf("%zu\n",sizeof(foo));
printf("%zu\n",sizeof(bar));
}
输出
3
4
使用严格的标准设置 (-std=c11 -pedantic-errors
) 在 gcc、clang 和 icc 上进行测试。
使用上述 PACK_ON 我得到错误标识符“pack”未定义。我设法通过这样做来解决这个问题:#define PACK_ON(n) _Pragma("pack(1)") 并手动更改少数 PACK_ON(2) 和 PACK_ON(4)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。