IAR工作台6.50.6.4958
IAR worbench common 6.5.9.2707
我们有一个宏
#define NOT_USED(p) ((void)(p))
用于确保IAR(C)编译器不会发出不使用该变量的警告,这样可以正常工作。
然而,这个宏似乎不适用于C ++编译器,即编译器 仍然会报告此变量未使用的警告。
如果C ++的宏看起来不一样,或者我们需要保护某些#pragma指令的变量吗?
/斯蒂芬
答案 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属性。