Compiler construction 已设置IAR Pe550变量,但从未使用

Compiler construction 已设置IAR Pe550变量,但从未使用,compiler-construction,warnings,workbench,iar,Compiler Construction,Warnings,Workbench,Iar,IAR工作台6.50.6.4958 IAR工作台通用6.5.9.2707 我们有一个宏 #define NOT_USED(p) ((void)(p)) 用于确保IAR(C)编译器不会发出未使用该变量的警告,这样可以正常工作 但是,这个宏似乎对C++编译器、编译器来说不起作用。 仍然报告此变量未使用的警告 宏是否看起来不同于C++,或者我们需要保护一些变量吗? /斯蒂芬我自己也遇到了这个问题。目前我发现的唯一解决方案是在一些引用中引用的,具体地说是指IAR C++编译器。有一个pragma可用

IAR工作台6.50.6.4958

IAR工作台通用6.5.9.2707

我们有一个宏

 #define NOT_USED(p) ((void)(p))
用于确保IAR(C)编译器不会发出未使用该变量的警告,这样可以正常工作

但是,这个宏似乎对C++编译器、编译器来说不起作用。 仍然报告此变量未使用的警告

宏是否看起来不同于C++,或者我们需要保护一些变量吗?


/斯蒂芬

我自己也遇到了这个问题。目前我发现的唯一解决方案是在一些引用中引用的,具体地说是指IAR C++编译器。有一个pragma可用于关闭该警告,但它必须应用于违规变量的声明。它不能以与您定义的未使用的宏完全相同的方式应用,这是不幸的。我尝试了一点来想出一个更跨平台的解决方案,但没有马上想到什么。如果确实需要宏窗体,则需要使用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系统ICC)
#定义未使用(变量声明)\
_Pragma(“diag_suppress=Pe177,Pe550”)\
var_声明\
_Pragma(“diag_default=Pe177,Pe550”)
#否则//!已定义(IAR系统ICC)
#定义未使用(变量声明)变量声明
#恩迪夫
int main(){
未使用(int32_t foo;)
未使用(int32\u t bar=0;)
未使用(常数int32\t baz=1;)
返回0;
}

请注意,我没有在非IAR编译器上尝试过此宏,但我可以合理地确定,在这种情况下,它不会成功地进行干扰。我有点失望,因为我没能想出一个跨平台的解决方案来代替你展示的不用的宏,特别是因为它适用于C编译器。也许这值得向IAR系统提交错误报告/功能请求,因为这似乎是两个产品之间的差异。

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

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