繁体   English   中英

使用 IAR 编译 Cypress 软件时出现问题

[英]Problem compiling Cypress software with IAR

我有一个 Cypress BLE 模块,但 IAR 有编译问题。 在“ezsapi.h”中定义了这个宏:

#ifdef __GNUC__
    /* standard GNU C */
    #ifdef _WIN32
        /* MinGW, Cygwin, TDM-GCC, etc. */
        #define __PACKDEF(STRUCTNAME, STRUCTDEF) typedef struct STRUCTDEF __attribute__((__packed__,gcc_struct)) STRUCTNAME
    #else
        /* generic gcc */
        #define __PACKDEF(STRUCTNAME, STRUCTDEF) typedef struct STRUCTDEF __attribute__((__packed__)) STRUCTNAME
    #endif
    #define ALIGNED __attribute__((aligned(0x4)))
#else
    /* Microsoft Visual C++ */
    #define __PACKDEF(STRUCTNAME, STRUCTDEF) __pragma(pack(push, 1)) STRUCTDEF __pragma(pack(pop)) STRUCTNAME
    #define ALIGNED
#endif

IAR 通常使用#pragma pack(push,1)#pragma pack(pop) ,我尝试修改宏:

#define __PACKDEF(STRUCTNAME, STRUCTDEF) #pragma(pack(push, 1)) STRUCTDEF #pragma(pack(pop)) STRUCTNAME

使用原始宏,报告的错误是:

ezsapi.h(694) : Error[Pe020]: identifier "pack" is undefined
ezsapi.h(694) : Error[Pe018]: expected a ")" ezsapi.h(694) :
Error[Pe079]: expected a type specifier ezsapi.h(694) : Error[Pe260]:
explicit type is missing ("int" assumed) ezsapi.h(694) : Error[Pe141]:
unnamed prototyped parameters not allowed when body is present
ezsapi.h(694) : Error[Pe130]: expected a "{"

使用我的宏,报告的错误是:

(69 is the line where the macro is located)
ezsapi.h(69) : Error[Pe052]: expected a macro parameter name
ezsapi.h(69) : Error[Pe052]: expected a macro parameter name
ezsapi.h(694) : Error[Pe020]: identifier "pack" is undefined
ezsapi.h(694) : Error[Pe018]: expected a ")" ezsapi.h(694) :
Error[Pe079]: expected a type specifier ezsapi.h(694) : Error[Pe260]:
explicit type is missing ("int" assumed) ezsapi.h(694) : Error[Pe141]:
unnamed prototyped parameters not allowed when body is present
ezsapi.h(694) : Error[Pe130]: expected a "{"

IAR 的正确公式是什么? escaping 我是什么?

谢谢。

有两种方法可以解决这个问题。 我的建议是您使用__packed类型属性而不是#pragma pack()因为它具有更明确定义的含义。 然而,这需要打开 IAR 语言扩展。 如果您不能启用语言扩展或出于某些其他原因需要使用 pack-pragma,则必须使用替代 pragma 语法才能将其包含在预处理器宏中。 如果你使用_Pragma("pack(push,1)")_Pragma("pack(pop)")你的宏应该按预期工作。 两种选择的 PACKDEF 定义如下所示:

#define PACKDEF(STRUCTNAME, STRUCTDEF) typedef __packed struct STRUCTDEF STRUCTNAME

#define PACKDEF(STRUCTNAME, STRUCTDEF)  _Pragma("pack(push,1)") typedef struct STRUCTDEF STRUCTNAME _Pragma("pack(pop)")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM