1

IAR 工作台 6.50.6.4958

IAR 工作台通用 6.5.9.2707

我们有一个宏

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

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

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

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

/斯蒂芬

4

2 回答 2

1

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

于 2014-05-19T22:59:15.227 回答
1

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

于 2020-05-12T20:31:57.810 回答