문제

나는이 매크로가 이전에 정의 된 것을 보았지만 실제로 그 목적을 알지 못했습니다. 누구든지 이것에 빛을 발할 수 있습니까?

도움이 되었습니까?

해결책

이것은 일반적으로 임베디드 프로그래밍에서 볼 수있는 최적화에 사용되는 컴파일러 고유입니다. 내가 사용한 유일한 시간은 변수의 범위가 제한되어 있다고 주장하는 스위치 명령문의 "기본값"에 있습니다. 예시:

 /* 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)'을 대신 할 수있는 변명으로 간주 될 수 있습니다. 코드는 결코 실행되지 않기 때문에 그 주장은 결코 해고되지 않을 것입니다. 물론, 그 주장이 불타고 있다면, 당신은 당신이 문제가 있다는 것을 알고 있습니다.

클래식 용지도 참조하십시오 "발생할 수 없거나 / * 다시 연락하지 않았습니다 * / 또는 실제 프로그램 덤프 코어".

지금도 읽을 가치가 있습니다.

테스트의 일부로 전에 그런 것을 보았습니다. 그 경우 ~이다 실행 된 그러면 버그가 있다는 것을 알고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top