[c] if-else 블록에서 ‘if (0)’블록의 목적은 무엇입니까?

내 질문은 내가 주제에서 언급 한 라인과 생산 코드 내부의 많은 곳에서 볼 수있는 라인에 관한 것입니다.

전체 코드는 다음과 같습니다.

if (0) {
    // Empty braces
} else if (some_fn_call()) {
    // actual code
} else if (some_other_fn_call()) {
    // another actual code
    ...
} else {
    // default case
}

다른 지점은 내 질문과 관련이 없습니다. if (0)여기 에 넣는 의미가 무엇인지 궁금합니다 . 중괄호가 비어 있으므로 코드 블록에 주석을 달아야한다고 생각하지 않습니다. 컴파일러가 최적화를 수행하도록 의도 했습니까? 아니면 의도가 다른가요?

나는 SO와 인터넷 에서이 명백한 사건을 찾으려고 노력했지만 성공하지 못했습니다. JavaScript에 대해서는 비슷한 질문이 있지만 C는 아닙니다. 또 다른 질문이 있습니다 .`if` 조건에서 0이 할당되면 어떻게됩니까? ‘if (0)’사용법 자체가 아니라 변수에 대한 제로 할당에 대해 설명합니다.



답변

나는 때때로 이것을 대칭을 위해 사용하기 때문에 나는 else if{첫 번째를 신경 쓰지 않고 내 편집기로 다른 것을 자유롭게 움직일 수있다 if.

의미 적으로

if (0) {
    // Empty braces
} else 

부분은 아무것도하지 않으며 최적화 프로그램을 사용하여 삭제할 수 있습니다.


답변

이것은 #if진술 이있는 경우 유용 할 수 있습니다.

   if (0)
   {
       // Empty block
   }
#if TEST1_ENABLED
   else if (test1())
   {
      action1();
   }
#endif
#if TEST2_ENABLED
   else if (test2())
   {
      action2();
   }
#endif

기타

이 경우 모든 (그리고 모든) 테스트를 수행 할 수 있으며 #if코드는 올바르게 컴파일됩니다. 거의 모든 컴파일러가 if (0) {}부품 을 제거합니다 . 간단한 자동 생성기는 코딩이 약간 더 쉬우므로 이와 같은 코드를 생성 할 수 있습니다. 첫 번째 활성화 된 블록을 별도로 고려할 필요는 없습니다.


답변

생성 된 코드에서 사용 된 유사한 패턴을 보았습니다. 예를 들어, SQL에서 라이브러리가 다음 where절을 방출하는 것을 보았습니다 .

where 1 = 1

이것은 아마도 다른 기준을 추가하기가 더 쉬울 것입니다. 왜냐하면 모든 추가 기준 and이 첫 번째 기준인지 아닌지를 확인하기위한 추가 검사 대신 추가 될 수 있기 때문 입니다.


답변

작성된 바와 if (0) {}같이이 절은 아무 것도 컴파일하지 않습니다.

이 사다리의 상단에있는 절의 기능은 0a 1또는 로 변경하여 다른 모든 기능을 한 번에 (디버깅 또는 비교 목적으로) 일시적으로 비활성화 할 수있는 쉬운 장소를 제공하는 것 true입니다.


답변

나는 어떤 최적화도 확신하지 못하지만 내 2 센트 :

이것은 하나의 주요 조건이 제거 된 코드 수정 (초기 if블록 의 함수 호출 )으로 인해 발생했지만 개발자 / 관리자

따라서 관련 if블록 을 제거하는 대신 조건을 변경하고 계속 진행 if(0)했습니다.


답변

코드 썩음입니다.

어떤 시점에서 “만약”이 유용한 일을했다면 상황이 바뀌었고 평가중인 변수가 제거되었을 수도 있습니다.

시스템을 수정 / 변경 한 사람은 가능한 한 시스템의 논리에 영향을 미치 므로 코드를 다시 컴파일해야합니다. 그래서 그는 빠르고 쉬운 “if (0)”을 남기고 자신이하고 싶은 것이 무엇인지 완전히 확신하지 못합니다. 그는 시스템을 작동시키고 시스템을 완전히 고치기 위해 돌아 가지 않습니다.

그런 다음 다음 개발자가 의도적으로 수행되었다고 생각 하고 코드의 해당 부분 만 주석 처리합니다 (어쨌든 평가되지 않으므로). 다음에 코드를 만질 때 해당 주석이 제거됩니다.


답변

아직 언급되지 않은 한 가지 가능성 :이 if (0) {회선은 중단 점에 편리한 지점을 제공 할 수 있습니다.

디버깅은 종종 최적화되지 않은 코드에서 수행되므로 항상 거짓 테스트가 수행되고 중단 점이 설정 될 수 있습니다. 프로덕션 용으로 컴파일하면 코드 라인이 최적화됩니다. 겉보기에 쓸모없는 라인은 릴리스 빌드에 영향을 미치지 않고 개발 및 테스트 빌드 기능을 제공합니다.

위의 다른 좋은 제안도 있습니다. 목적이 무엇인지 실제로 아는 유일한 방법은 저자를 추적하고 물어 보는 것입니다. 소스 코드 제어 시스템이 도움이 될 수 있습니다. ( blame유형 기능을 찾으십시오 .)