IAR Pe550变量已设置但从未使用过

时间:2013-09-23 06:03:42

标签: compiler-construction warnings workbench iar

IAR工作台6.50.6.4958

IAR worbench common 6.5.9.2707

我们有一个宏

 #define NOT_USED(p) ((void)(p))

用于确保IAR(C)编译器不会发出不使用该变量的警告,这样可以正常工作。

然而,这个宏似乎不适用于C ++编译器,即编译器 仍然会报告此变量未使用的警告。

如果C ++的宏看起来不一样,或者我们需要保护某些#pragma指令的变量吗?

/斯蒂芬

2 个答案:

答案 0 :(得分:0)

我自己也遇到了这个问题。我发现的唯一解决方案是在Renesas documentation中引用的,它特别指的是IAR C ++编译器。有一个pragma可用于关闭该警告,但必须将其应用于违规变量的声明。它不能以与您定义的NOT_USED宏完全相同的方式应用,这是不幸的。我试着提出一个更加跨平台的解决方案,但是没有什么东西可以立即浮现在脑海中。如果你想要一个宏表单,你需要使用pragma的运算符表达式表单,它允许你在一个宏扩展中嵌入一个pragma,例如:

#include <cstdint>

#if defined(__IAR_SYSTEMS_ICC__)
#define NOT_USED(var_declaration)        \
    _Pragma("diag_suppress=Pe177,Pe550") \
    var_declaration                      \
    _Pragma("diag_default=Pe177,Pe550")
#else // !defined(__IAR_SYSTEMS_ICC__)
#define NOT_USED(var_declaration) var_declaration
#endif

int main() {
    NOT_USED(int32_t foo;)
    NOT_USED(int32_t bar = 0;)
    NOT_USED(const int32_t baz = 1;)
    return 0;
}

请注意,我没有在非IAR编译器上尝试过这个宏,但我有理由相信它在这种情况下不会成功干扰。我有点失望的是,我无法想出一个以跨平台方式工作的解决方案,可以替代你展示的NOT_USED宏,特别是因为它适用于C编译器。也许这对IAR Systems的错误报告/功能请求是值得的,因为它们似乎是两个产品之间的差异。

答案 1 :(得分:0)

在声明未使用的全局变量时,我通常在IAR中使用__root属性。