_NEVER_EXECUTED ()의 목적?
-
03-07-2019 - |
문제
나는이 매크로가 이전에 정의 된 것을 보았지만 실제로 그 목적을 알지 못했습니다. 누구든지 이것에 빛을 발할 수 있습니까?
해결책
이것은 일반적으로 임베디드 프로그래밍에서 볼 수있는 최적화에 사용되는 컴파일러 고유입니다. 내가 사용한 유일한 시간은 변수의 범위가 제한되어 있다고 주장하는 스위치 명령문의 "기본값"에 있습니다. 예시:
/* Get DTMF index */
switch(dtmf)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
/* Handle numeric DTMF */
index = dtmf - '0';
break;
case 'A':
case 'B':
case 'C':
case 'D':
index = dtmf - 'A' + 10;
break:
default:
_never_executed();
break;
}
아마도 모든 컴파일러와 함께 작동하지 않을 것입니다 ...
다른 팁
FYI로서 MSVC는 비슷한 것을 가지고 있습니다 (약간 더 유연성이 있음) __assume()
본질적. 그들이주는 한 가지 예 :
int main(int p)
{
switch(p){
case 1:
func1(1);
break;
case 2:
func1(-1);
break;
default:
__assume(0);
// This tells the optimizer that the default
// cannot be reached. As so, it does not have to generate
// the extra code to check that 'p' has a value
// not represented by a case arm. This makes the switch
// run faster.
}
}
어떤 버전의 MSVC 버전이 처음 지원되었는지 잘 모르겠습니다.
전에는 보지 못했지만 Google을 사용하는 STFW는 먼저이 질문을 제기 한 다음 다른 참조를 제시합니다. 그것이 말한 바에 따르면, 컴파일러에 대한 힌트는 코드가 결코 실행되지 않는다는 힌트입니다. 따라서 컴파일러는 최적화를 수행 할 수 있습니다. 합법적으로 'Assert (0)'을 대신 할 수있는 변명으로 간주 될 수 있습니다. 코드는 결코 실행되지 않기 때문에 그 주장은 결코 해고되지 않을 것입니다. 물론, 그 주장이 불타고 있다면, 당신은 당신이 문제가 있다는 것을 알고 있습니다.
클래식 용지도 참조하십시오 "발생할 수 없거나 / * 다시 연락하지 않았습니다 * / 또는 실제 프로그램 덤프 코어".
지금도 읽을 가치가 있습니다.
테스트의 일부로 전에 그런 것을 보았습니다. 그 경우 ~이다 실행 된 그러면 버그가 있다는 것을 알고 있습니다.