2013-09-23 5 views
0

IAR Workbench 6.50.6.4958переменная IAR Pe550 была установлена, но не никогда не использовал

IAR worbench общий 6.5.9.2707

У нас есть макрос

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

, который используется, чтобы убедиться, что IAR (C) не выдаст предупреждение о том, что переменная не используется, что отлично работает.

Однако этот макрос, похоже, не работает для компилятора C++, компилятор все еще сообщает предупреждение о том, что эта переменная не используется.

Должен ли макрос выглядеть по-другому для C++ или нам нужно защищать переменные, имеющие какую-то директиву #pragma?

/Stefan

+0

Почему бы не исключить декларацию вместе, когда переменная не используется, используя '# if' или' # ifdef': s? – Lindydancer

ответ

0

Я просто столкнулся с этой проблемой сам. Единственное решение, которое я нашел в настоящее время, упоминалось в некоторых 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, поскольку это, по-видимому, расхождение между их двумя продуктами.

Смежные вопросы