IAR 工作台 6.50.6.4958
IAR 工作台通用 6.5.9.2707
我们有一个宏
#define NOT_USED(p) ((void)(p))
用于确保 IAR (C) 编译器不会发出未使用变量的警告,这工作正常。
然而这个宏似乎不适用于 C++ 编译器,编译器仍然报告这个变量未使用的警告。
C++ 的宏是否应该看起来不同,或者我们是否需要使用某种#pragma 指令来保护变量?
/斯蒂芬
IAR 工作台 6.50.6.4958
IAR 工作台通用 6.5.9.2707
我们有一个宏
#define NOT_USED(p) ((void)(p))
用于确保 IAR (C) 编译器不会发出未使用变量的警告,这工作正常。
然而这个宏似乎不适用于 C++ 编译器,编译器仍然报告这个变量未使用的警告。
C++ 的宏是否应该看起来不同,或者我们是否需要使用某种#pragma 指令来保护变量?
/斯蒂芬
我自己也遇到了这个问题。我暂时找到的唯一解决方案在一些专门提到 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 提出错误报告/功能请求,因为这似乎是他们两个产品之间的差异。
在声明未使用的全局变量时,我通常在 IAR 中使用 __root 属性。