IAR工作台6.50.6.4958
IAR worbench通用6.5.9.2707
我们有一个宏
#define NOT_USED(p) ((void)(p))
用于确保IAR(C)编译器不会发出未使用该变量的警告,这很好用。
但是此宏似乎不适用于C ++编译器,仍报告该变量未使用的警告。
该宏对于C ++而言应该看起来有所不同,还是我们需要通过某种#pragma指令来保护变量?
/ Stefan
我只是自己遇到了这个问题。我暂时发现的唯一解决方案是在某些Renesas documentation中引用的,该解决方案专门涉及IAR C ++编译器。可以使用一种编译指示来关闭该警告,但是必须将其应用于违规变量的声明。不幸的是,它不能以与您定义的NOT_USED宏完全相同的方式应用。我花了一点时间想出一个更跨平台的解决方案,但是没有立即想到。如果确实要使用宏形式,则需要将操作符表达式形式用于编译指示,以便将编译指示嵌入宏扩展内,例如:
#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属性。