2013-09-23 3 views
0

IAR 워크 벤치 6.50.6.4958IAR Pe550 변수가 설정하지만

IAR은

6.5.9.2707 우리는 확인 IAR을 만드는 데 사용되는 매크로

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

이 일반적인 worbench 사용되지 않았다 (C) 컴파일러는 변수가 사용되지 않는다는 경고를하지 않을 것이다.

그러나이 매크로는 C++ 컴파일러에서 작동하지 않는 것 같지만 컴파일러 은 여전히이 변수가 사용되지 않는다고 경고합니다.

매크로가 C++와 다르게 표시되어야합니까? 아니면 #pragma 지시어와 같은 변수를 지켜야합니까?

/stefan

+0

변수가 사용되지 않을 때'# if' 또는'# ifdef'를 사용하여 선언을 모두 제외하지 않는 이유는 무엇입니까? – Lindydancer

답변

0

나는이 문제를 직접 해결했습니다. 당분간 발견 한 유일한 해결책은 구체적으로 IAR C++ 컴파일러를 참조하는 일부 Renesas documentation에서 참조되었습니다. 해당 경고를 끄는 데 사용할 수있는 pragma가 있지만 문제가되는 변수의 선언에 적용해야합니다. 그것은 당신이 정의한 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에 대한 버그 보고서/기능 요청 일 가치가 있습니다.

관련 문제