【问题标题】:IAR Pe550 variable was set but not never usedIAR Pe550 变量已设置但从未使用过
【发布时间】:2013-09-23 06:03:42
【问题描述】:

IAR 工作台 6.50.6.4958

IAR 工作台通用 6.5.9.2707

我们有一个宏

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

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

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

对于 C++,宏是否应该看起来不同,或者我们是否需要使用某种#pragma 指令来保护变量?

/斯蒂芬

【问题讨论】:

  • 为什么不使用 #if#ifdef:s 在不使用变量时一起排除声明?

标签: compiler-construction warnings workbench iar


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我自己也遇到了这个问题。我暂时找到的唯一解决方案在一些Renesas documentation 中被引用过,它专门指的是 IAR C++ 编译器。有一个编译指示可用于关闭该警告,但它必须应用于有问题的变量的声明。它不能以与您定义的 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 提出错误报告/功能请求,因为这似乎是他们两个产品之间的差异。

    【讨论】:

    • 我确认建议的解决方案确实适用于 IAR ANSI C/C++ Compiler V9.10.2.313/W64 for ARM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2020-01-29
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多