source

if-else 블록에서 'if(0)' 블록의 용도는 무엇입니까?

factcode 2022. 8. 24. 23:50
반응형

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에는 없습니다. 다른 질문은 0이 'if' 조건으로 할당되면 어떻게 되는가 하는 것입니다만, 'if (0)' 사용 자체가 아니라 변수에 대한 0 할당에 대해 설명합니다.

은 '가 있을 때마침.#if ala, ala, ala

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

기타.

및 모든)합니다.#ifout, 될 거예요 out, ed, ed, ed, ed, ed, ed, ed, ed, ed, ed, ed, ed, ed, ed, ed, ed.됩니다.if (0) {}부분. 간단한 오토제너레이터는 코드화가 조금 더 쉬우므로 이와 같은 코드를 생성할 수 있습니다. 첫 번째 활성화 블록을 별도로 고려할 필요가 없습니다.

을 할 수 요. 을 사용하다else if{ 편집자는 쓰지 않고 .if.

의미론적으로

if (0) {
    // Empty braces
} else 

부품은 아무것도 하지 않으며 옵티마이저를 사용하여 삭제할 수 있습니다.

생성된 코드에 사용되는 유사한 패턴을 본 적이 있습니다.들어가 다음과 SQL을 을 본이 있습니다.where절을 클릭합니다.

where 1 = 1

이것은 아마도 다른 기준만 추가하는 것을 더 쉽게 만들 수 있습니다. 왜냐하면 모든 추가 기준에는 다음 조건을 추가할 수 있기 때문입니다.and그것이 첫 번째 기준인지 아닌지를 확인하기 위해 추가 체크하는 대신.

바와 같이, 「 」는if (0) {}0으로 하다

맨 또는 으로 다른 할 수 입니다.0 a까지1 ★★★★★★★★★★★★★★★★★」true

언급되지 않은 의 가능성: " " " " " " " " 」 。if (0) {라인은 브레이크 포인트에 편리한 장소를 제공할 수 있습니다.

대부분의 경우 디버깅은 최적화되지 않은 코드로 이루어지기 때문에 항상 false 테스트가 존재하며 브레이크 포인트를 설정할 수 있습니다.생산을 위해 컴파일될 때 코드 라인은 최적화됩니다.쓸모없어 보이는 라인은 릴리즈 빌드에 영향을 주지 않고 개발 및 테스트 빌드에 기능을 제공합니다.

위의 다른 좋은 제안들도 있다; 목적이 무엇인지 정말로 알 수 있는 유일한 방법은 저자를 추적해서 물어보는 것이다.이 될 수 (.blame functionalitytype 능 - ) 。

최적화를 확신할 수는 없지만, 제 의견으로는:

은, 의 코드의 번째 「」, 「1」의 함수 콜)에 의해서 했습니다.if, (예: ,, block, ersers)) ), ,유유유/ block block block block block)

에, 관련 붙여진 「」를 하는 에,if을 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,if(0)넘어갔어요.

코드 썩었어.

"만약"이 유용한 일을 했다면, 상황이 바뀌었을 것이고, 아마도 평가 대상 변수가 제거되었을 것이다.

시스템을 수정/변경하는 담당자는 시스템의 논리에 최대한 영향을 주지 않았기 때문에 코드가 재컴파일되도록 했습니다.그래서 그는 "if(0)"를 남깁니다. 왜냐하면 빠르고 쉽기 때문이고, 그가 원하는 것이 무엇인지 확실히 모르기 때문입니다.그는 시스템을 작동시키고 완전히 고치기 위해 돌아가지 않는다.

다음 개발자가 와서 그것이 의도적으로 이루어졌다고 생각하고 코드의 그 부분만 코멘트하고(어차피 평가되지 않기 때문에), 다음에 코드에 터치하면 코멘트가 삭제됩니다.

템플릿 언어를 사용하여 생성된 사전 확장 JavaScript에서 도달 불가능한 코드 블록을 보았습니다.

예를 들어, 읽고 있는 코드는, 그 시점에서 서버측에서만 사용 가능한 변수에 의존하는 최초의 조건을 사전에 평가한 서버로부터 붙여진 것일 수 있습니다.

if ( ${requestIsNotHttps} ){ ... }else if( ...

한 때 암탉이 잡혔던 것:

if ( 0 ){ ... }else if ( ...

이것이 내가 열정을 보이는 친서민 코더스 시대의 잠재적인 낮은 키보드 액티비티를 상대적으로 이해시키는 데 도움이 되기를 바랍니다!

이 구성은 또한 C에서 도달 불가능한 코드가 컴파일러에 의해 여전히 확인된다는 사실에 의존하여 타입 안전성을 가진 범용 프로그래밍을 구현하기 위해 사용될 수 있습니다.

// this is a generic unsafe function, that will call fun(arg) at a later time
void defer(void *fun, void *arg);

// this is a macro that makes it safer, by checking the argument
// matches the function signature
#define DEFER(f, arg) \
   if(0) f(arg); \              // never actually called, but compile-time checked
   else defer(f, (void *)arg);  // do the unsafe call after safety check

void myfunction(int *p);

DEFER(myfunction, 42);     // compile error
int *b;
DEFER(myfunction, b);      // compiles OK

@PSkokik의 대답은 괜찮지만, 나는 내 의견을 덧붙인다.코멘트로 해야 할지 대답으로 해야 할지 망설여집니다. IMHO는 다른 사람이 볼 가치가 있지만 코멘트는 보이지 않는 경우가 많기 때문에 후자를 선택합니다.

가끔 사용하는 것뿐만 아니라

if(0) {
   //deliberately left empty
} else if( cond1 ) {
   //deliberately left empty
} else if( cond2 ) {
   //deliberately left empty
...
} else {
   // no conditions matched
}

하지만 가끔 하는 일도 있어요.

if( 1 
    && cond1 
    && cond2
    ...
    && condN
) {

또는

if( 0 
    || cond1 
    || cond2
    ...
    || condN
) {

복잡한 상황 때문에.같은 이유로 편집이 용이함, #ifdef 등

그 점에 대해서는 Perl에서 다음 작업을 수행합니다.

@array = (  
    elem1,
    elem2,
    ...
    elem1,
) {
  • 목록 끝에 있는 쉼표를 확인합니다.쉼표가 C 및 C++ 목록에서 구분자인지 구분자인지 잊어버렸습니다.IMHO는 우리가 배운 것 중 하나입니다.[Perl에서 쉼표를 붙이는 것은 나쁜 관행입니까?쉼표]는 좋은 것입니다.다른 새로운 표기법과 마찬가지로 익숙해지려면 시간이 걸립니다.

if(0) lisp

(cond   (test1    action1)
   (test2    action2)
   ...
   (testn   actionn))

짐작하셨겠지만, 제가 계약할 수 있는 그대로입니다.

(cond   
   (test1    action1)
   (test2    action2)
   ...
   (testn   actionn)
)

나는 때때로 이것에 대해 더 인간적으로 읽을 수 있는 구문이 어떻게 보일지 상상해보려고 노력했다.

아마

IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI

Dikstra의 [https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if][Guarded Command Language]에서 영감을 얻었습니다.

이 , 이 구문에서는 조건이 병렬로 평가된다는 합니다.if...else-if는 조건의 순차적 및 우선순위 평가를 의미합니다.

특히 편리한 곳에서 다른 프로그램을 생성하는 프로그램을 작성할 때 이런 작업을 시작했습니다.

인텔의 오래된 iHDL을 사용하여 RTL을 작성할 때 다음과 같은 코딩을 했습니다.

   IF 0 THEN /*nothing*/
   **FORC i FROM 1 TO 10 DOC** 
   ELSE IF signal%i% THEN    
      // stuff to do if signal%i% is active
   **ENDC** 
   ELSE   
      // nothing matched 
   ENDIF

서, 「」는FORC..DOC..ENDC 구조입니다.이에서는 「프로세서루프 구조」가 됩니다.

   IF 0 THEN /*nothing*/
   ELSE IF signal1 THEN    
      // stuff to do if signal1 is active
   ELSE IF signal2 THEN    
      // stuff to do if signal2 is active
   ...
   ELSE IF signal100 THEN    
      // stuff to do if signal100 is active
   ELSE   
      // nothing matched 
   ENDIF

이것은 단일 할당, 비임페리얼 코드이므로 첫 번째 설정 비트 찾기 등의 작업을 수행해야 하는 경우 상태 변수 설정은 허용되지 않습니다.

   IF 0 THEN /*nothing*/
   ELSE IF signal1 THEN    
      found := 1
   ELSE IF signal2 THEN    
      found := 2
   ...
   ELSE IF signal100 THEN    
      found := 100
   ELSE   
      // nothing matched 
   ENDIF

그러고 보니 이런 건축물을 처음 접한 곳이었던 것 같다.

BTW, 일부에서 if(0) 스타일에 대해 제기되었던 반대 의견(다른 if 조건들은 순차적으로 의존하며 임의로 순서를 변경할 수 없음)은 RTL의 AND 및 OR 및 XOR 로직에는 적용되지 않지만 단락 & 및 |에는 적용됩니다.

앞서 말한 바와 같이 0은 false로 평가되며 브랜치는 컴파일러에 의해 최적화됩니다.

또, 새로운 기능이 추가되어 Kill-Switch가 필요한 코드(기능에 문제가 있는 경우는 Kill-Switch를 끄기만 하면 됩니다)에서도, 얼마 후에 Kill-Switch를 삭제해도 프로그래머는 브랜치를 삭제하지 않았습니다.

if (feature_a_active()) {
    use_feature_a();
} else if (some_fn()) {
   ...

되었다

if (0) {
   // empty
} else if (some_fn()) {
   ...

★★★★★★★★★★★★★★★★★」탐색기에서 gcc의 clang 코드에 되지 않습니다.if (0)최적화가 완전히 비활성화된 경우에도 블록:

https://godbolt.org/z/PETIks

if (0)생성된 코드에 변경을 가하지 않기 때문에 최적화가 아니라고 판단합니다.

도 있어요.if나중에 제거된 블록.될 것 때문에 하실 수 있습니다.

이 블록을 디버깅하는 데 도움이 되는 것은 블록 1을 넣는 것뿐입니다.그렇지 않으면 차단 기능이 모두 비활성화됩니다.또한 if else 블록을 확장할 수 있습니다.

    Actually according to my opinion, if we put any variable for checking inside
    e.g:-
public static void main(string args[])
{
        var status;
        var empList=_unitofWork.EmpRepository.Get(con=>con.isRetired==true);
        //some code logic 
        if(empList.count>0)
        {
          status=true;
        }
        if(status)
        {
         //do something
        }
        else
        {
        //do something else
        }
}
     if then its dynamically get the value in run time and invoke the logic inside it, else its simply extra line of code i guess.

    Anybody have any depth knowledge why this thing is used....or agree with me.
    kindly respond. 

예를 들어, 오류를 처리하는 데 사용되는 것을 본 적이 있습니다.

if(0){
lable1:
   //do something
}
if(0){
lable2:
   //do something
}
.
.
and so on.

if(condition_fails)
   goto lable1;

이는 goto를 사용하여 오류를 관리할 때 유용합니다. 오류 발생 시에만 문이 실행됩니다.나는 이것을 매우 오래된 C-code(함수 인수들이 '(')' 밖에 쓰여져 있음)에서 보았는데, 이제는 아무도 이것을 따라하지 않는다고 생각한다.

본 이 높은 버전/ 버전디버깅을 위해 하여 디버깅을 위해 그것을 '로했기 때문'이라고 생각합니다.if(0)거기에 있던 것을 제거하는 데 다소 게으른 방법입니다.

언급URL : https://stackoverflow.com/questions/53298646/what-is-the-purpose-of-an-if-0-block-in-if-else-block

반응형