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

问题描述 投票:0回答:2

IAR工作台6.50.6.4958

IAR worbench通用6.5.9.2707

我们有一个宏

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

用于确保IAR(C)编译器不会发出未使用该变量的警告,这很好用。

但是此宏似乎不适用于C ++编译器,仍报告该变量未使用的警告。

该宏对于C ++而言应该看起来有所不同,还是我们需要通过某种#pragma指令来保护变量?

/ Stefan

compiler-construction warnings workbench iar
2个回答
0
投票

我只是自己遇到了这个问题。我暂时发现的唯一解决方案是在某些Renesas documentation中引用的,该解决方案专门涉及IAR C ++编译器。可以使用一种编译指示来关闭该警告,但是必须将其应用于违规变量的声明。不幸的是,它不能以与您定义的NOT_USED宏完全相同的方式应用。我花了一点时间想出一个更跨平台的解决方案,但是没有立即想到。如果确实要使用宏形式,则需要将操作符表达式形式用于编译指示,以便将编译指示嵌入宏扩展内,例如:

#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提交错误报告/功能请求可能值得,因为这似乎是两个产品之间的差异。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.