2017-03-28 3 views
9

난하려면 openssl 소스 코드, here에서 이상한 관용구를 발견하고 다음 반복 :이 C 관용구 (if (1))는 무엇입니까?

if ((in == NULL) && (passwds == NULL)) { 
#ifndef OPENSSL_NO_UI 
     /* build a null-terminated list */ 
     static char *passwds_static[2] = { NULL, NULL }; 

     passwds = passwds_static; 
     if (in == NULL) 
      if (EVP_read_pw_string 
       (passwd_malloc, passwd_malloc_size, "Password: ", 
       !(passed_salt || in_noverify)) != 0) 
       goto end; 
     passwds[0] = passwd_malloc; 
#else 
     BIO_printf(bio_err, "password required\n"); 
     goto end; 
#endif 
} 

내가 몇 가지 설명을 배제 :에

if ((in == NULL) && (passwds == NULL)) { 
     if (1) {         (* <---- HERE *) 
#ifndef OPENSSL_NO_UI 
      /* build a null-terminated list */ 
      static char *passwds_static[2] = { NULL, NULL }; 

      passwds = passwds_static; 
      if (in == NULL) 
       if (EVP_read_pw_string 
        (passwd_malloc, passwd_malloc_size, "Password: ", 
        !(passed_salt || in_noverify)) != 0) 
        goto end; 
      passwds[0] = passwd_malloc; 
     } else { 
#endif 
      BIO_printf(bio_err, "password required\n"); 
      goto end; 
     } 
} 

그것은 코드의이 작품은 동등 보인다

  • passwds_static에 대한 블록 범위를 도입 할 수 있지만, 포함하는 if은 sim ilar 목적
  • 몇 가지 의미있는 변환을 통해 의미가 없지만 그 구조는 since the introduction of OPENSSL_NO_UI 인 구조 일 수 있습니다.

여기에 뭔가가 빠졌습니까? 이 if (1)의 장점은 무엇입니까? 다른 코드베이스에서 사용됩니까?

감사합니다.

기타 유사한 장소에서 찾고 후
+1

그것의 유일한 목적은 어떤 이유에서 건 'else else'절을 피하는 것입니다. – StoryTeller

+1

Dup of http://stackoverflow.com/questions/2266060/why-would-somebody-use-an- if-1-c-preprocessor-directive? – CristiFati

+2

@CristiFati - 아니요. # if 1에 관한 것은 아닙니다. 왜냐하면 그 구조가 질문에 전혀 나타나지 않기 때문입니다. 그것은'if (1)'에 관한 것입니다. – StoryTeller

답변

10

, I found an explanation : (I 추측들이 CI를 포함한) 대부분의 경우

if (1) { /* This is a trick we use to avoid bit rot. 
      * at least the "else" part will always be 
      * compiled. 
      */ 
#ifdef AF_INET6 
    family = AF_INET6; 
} else { 
#endif 
    BIOerr(BIO_F_ACPT_STATE, BIO_R_UNAVAILABLE_IP_FAMILY); 
    goto exit_loop; 
} 

, OPENSSL_NO_UI가 정의되지 않은, 그래서 모두 가지가 컴파일됩니다. API 중 하나가 변경 사항을 사용하면 컴파일러가이를 확인하고 모든 컴파일 타임 스위치를 테스트 할 필요없이 수정할 수 있습니다.

2

컴파일러 스위치 #ifdef과 비슷하게 실행해서는 안되는 코드를 제거하는 데 사용됩니다. 이와 같은 이상한 일들은 무엇보다도 빈약 한 버전 제어를 나타냅니다.

이 방법은 권장되지 않습니다. 어떤 경우에도 실행되지 않는 소스 코드가 없어야합니다. 버전 관리를 사용하는 것이 더 좋으며 컴파일러 스위치를 사용할 수없는 경우 또는 가능하지 않은 경우 코드를 주석 처리하는 것이 좋습니다.

0

문 :

if(1) { 

항상 닫는 중괄호에 대한 중괄호를 열고 일치하는 것입니다.

관련 문제