source

블록 댓글 작성에 #if 0을 사용하는 이유는 무엇입니까?

manycodes 2023. 10. 23. 21:59
반응형

블록 댓글 작성에 #if 0을 사용하는 이유는 무엇입니까?

역공학 코드를 사용하면 스타일에 약간 겁이 나지만, 이런 일을 할 이유가 없는지 확인하고 싶었습니다.

저만 그런 건가요 아니면 끔찍한 코딩 스타일인가요?

if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);

그리고 왜 랩 코드가 컴파일을 위한 것이 아니었습니까?

#if 0
....
#endif

댓글 대신에?


편집: 그래서 아래에 설명된 것처럼, 이것은 내가 미처 깨닫지 못했던 /* */의 실패 가능성 때문입니다.

하지만 나는 여전히 이해할 수 없습니다. 프로그래밍 환경 도구나 좋아하는 텍스트 편집기의 매크로를 사용하여 "/"를 사용하여 댓글을 차단하는 것은 어떨까요?

이것이 시각적으로 건너뛸 때 훨씬 더 간단하고 쉽게 알 수 있지 않을까요?


제가 C에 경험이 없어서 이런 것들이 좋은 아이디어일 수도 있는 이유를 놓치고 있는 것일까요? 아니면 변명의 여지가 없는 것일까요? 그리고 이 코드가 얼마나 추한지에 대해 짜증을 느끼는 것은 정당한 것일까요?

#if 0제거된 블록에 블록이 포함되어 있을 때 꽤 자주 사용됩니다.

좋은 연습이라고 말하지는 않겠지만, 오히려 자주 봅니다.

한 줄 flow-control+문은 이해하기 쉽지만 개인적으로는 피하지만 (그리고 제가 작업한 코딩 지침의 대부분은 금지합니다.)

그건 그렇고 제목을 좀 유용하게 수정할 것 같아요 "블록 댓글 대신 #if 0을 사용하는 이유"

다음 사항이 있는 경우

#if 0
        silly();
        if(foo)
           bar();
        /* baz is a flumuxiation */
        baz = fib+3;
#endif

만약 당신이 순진하게 교체한다면.#if 0/#endif와 함께/* */, 그것은 당신이 그것을 칠 때 구문 오류를 야기하면서 fluuxiation 후에 댓글이 바로 끝나도록 할 것입니다.*/#endif위에..

EDIT: 마지막 노트 하나, 종종 다음과 같습니다.#if 0구문은 개발 중에 사용될 뿐이며, 특히 여러 버전이나 종속성 또는 하드웨어 플랫폼을 지원해야 하는 경우에 사용됩니다.코드가 다음으로 수정되는 것은 드문 일이 아닙니다.

#ifdef _COMPILED_WITHOUT_FEATURE_BAZ_
    much_code();
#endif

수백 개의 #정의 상수를 정의하는 중앙 집중식 헤더를 사용합니다.그것은 세상에서 가장 예쁜 것은 아니지만, 제가 괜찮은 크기의 프로젝트를 수행할 때마다, 우리는 런타임 스위치, 컴파일 시간 상수(이것), 컴파일 시간 컴파일 결정(버전에 따라 다른 .cpp를 사용함), 그리고 때때로 템플릿 솔루션의 조합을 사용했습니다.모든 것은 세부 사항에 달려 있습니다.

당신이 개발자이기는 하지만, 처음부터 일을 시작하는 것은..#if 0오래된 코드가 여전히 가치가 있는지 확신할 수 없는 경우에는 매우 일반적입니다.

댓글은 댓글입니다.그들은 코드를 설명합니다.

컴파일에서 제외되는 코드는 주석이 아닌 코드입니다.여기에는 현재 컴파일되지 않는 코드를 설명하는 주석이 포함되는 경우가 많습니다.

그것들은 두 개의 별개의 개념이고, 같은 구문을 강요하는 것은 저를 실수라고 생각하게 합니다.


저는 상당한 리팩터의 중간에 있고 이 패턴을 많이 사용하고 있기 때문에 이것을 편집하는 것입니다.

이 리팩터의 일부로, 저는 널리 사용되는 타입을 제거하고 다른 타입으로 교체하고 있습니다.물론 그 결과는 아무것도 지어지지 않는다는 것입니다.

그리고 저는 제가 끝나면 모든 것이 구축되고 모든 테스트가 실행되기를 바라는 마음으로 여러 문제를 해결하는 데 며칠을 보내는 것이 정말 싫습니다.

그래서 저의 첫 번째 단계는 컴파일되지 않는 모든 코드를 #iff-def-out하고, 그 코드를 부르는 모든 단위 테스트를 [무시]하는 것입니다.이렇게 하면 모든 것이 구축되고 무시하지 않는 테스트가 모두 통과됩니다.

결과적으로 다음과 같은 많은 기능이 있습니다.

public void MyFunction()
{
#if true
    throw new NotImplementedException("JT-123");
#else
    // all the existing code that won't compile
#endif
}

그런 다음 한 번에 하나씩 단위 테스트를 무시하고 기능을 하나씩 수정합니다.

이 모든 것을 실행하는 데 며칠이 걸릴 것이고, 이 #if가 모두 사라지면 이를 병합하기 위한 풀 요청을 만들지만, 이 과정에서 도움이 된다고 생각합니다.

C 스타일 주석이 네스팅되지 않는 문제 외에도 코드 블록을 비활성화하는 문제가 있습니다.#if 0코드 폴딩을 지원하는 편집기를 사용하는 경우 접을 수 있다는 장점이 있습니다.C++ 스타일의 주석으로 대규모 코드 블록을 비활성화하는 것은 편집기 지원/매크로가 없으면 실행 불가능할 수 있는 반면, 어떤 편집기에서도 매우 쉽게 수행할 수 있습니다.

또한 많은#if 0토막이 나다else차단도 가능합니다.이를 통해 두 구현/알고리즘을 쉽게 전환할 수 있으며, 한 섹션을 대량 코멘트하고 다른 섹션을 대량 코멘트하는 것보다 오류 발생 가능성이 적습니다.하지만 당신은 다음과 같이 더 읽기 쉬운 것을 사용하는 것이 좋을 것입니다.#if DEBUG그 경우에는

다음을 사용하여 댓글을 차단하는 것입니다.//제가 생각할 수 있는 한 가지 이유는 소스 제어 시스템에 코드를 확인하면 해당 코드 라인에 대한 마지막 편집자가 블레임 로그에 표시된다는 것입니다.주석이 사용자에게 귀속되기를 원할 수도 있지만, 동시에 코드 자체도 사용자에게 귀속됩니다.물론 코드의 "진짜" 작성자에 대한 비난 로그를 확인해야 하는 경우 이전 개정판을 다시 살펴볼 수 있지만, 현재 개정판에서 해당 정보를 보존하면 시간을 절약할 수 있습니다.

저기 꽤 관용적인 C군요.뭐가 그렇게 문제인지 모르겠어요.이것은 아름다운 코드 조각은 아니지만 읽기 쉬우며 문맥이 없어도 무슨 일이 일어나고 있고 그 이유가 무엇인지 명확합니다.

변수 이름이 더 좋을 수도 있고, 그리고 아마도 사용하는 것이 더 안전할 것입니다.snprintf아니면 아마도strncpy.

그게 더 나을 수도 있다고 생각한다면 어떤 모습을 원하십니까?

제가 약간의 변화를 줄 수도 있습니다.

char username[32];
strncpy(username, 30, (pwbuf ? pwbuf->pw_name : user_id));
username[31] = '\0';

분명 모든 사람들은 이런 종류의 일에 대해 각자의 의견을 가지고 있습니다.자, 여기 제 것입니다.

나는 위와 같은 코드를 절대 쓰지 않을 것이고, 그런 코드를 쓴 사람들은 덜 생각할 것입니다.사람들이 스코프 교정기 없이 도망쳐도 괜찮다고 생각하고 있다가 그것에 물린 횟수를 셀 수가 없습니다.

컨트롤 문을 코드 블록과 같은 줄에 놓는 것은 더 좋지 않습니다. 들여쓰기가 없으면 읽기 중에 흐름 컨트롤을 보기가 더 어렵습니다.몇 년 동안 코딩을 해온 후에는 특정 시각적 단서에 의존할 수 있는 한 빠르고 정확하게 코드를 읽고 해석할 수 있는 것에 익숙해집니다."특별한 경우"를 위해 이러한 단서를 피하는 것은 독자가 아무 이유 없이 중단하고 더블테이크를 해야 한다는 것을 의미합니다.

#if (0), 반면, 개발 중에는 괜찮지만 코드가 "stable"(또는 최소한 교체)되면 제거해야 합니다.0의미 있는 전처리기 기호 이름을 사용합니다.

와, 저기!과민반응하지 마...

저는 다른 무엇보다도 일관성 없는 간격 때문에 더 허술하다고 생각합니다.비록 그 진술들이 그것을 연장하고 있지만, 저는 그들의 IF와 같은 선에 짧은 진술을 하는 것이 더 낫다는 것을 알게 된 적이 있습니다.

세로의 간결함을 위해서는 인라인 스타일이 더 좋습니다.쉽게 4줄, 더 많은 줄로 쪼개질 수 있습니다.

if (pwbuf) 
  sprintf(username,"%s",pwbuf->pw_name); 
else 
  sprintf(username,"%d",user_id); 

개인적으로 저는 다음 스타일이 너무 장황해서 파일을 훑어보기가 어려워서 싫어요.

if (pwbuf) 
{
  sprintf(username,"%s",pwbuf->pw_name); 
}
else
{ 
  sprintf(username,"%d",user_id); 
}

이상의 점하지만 모니터가 와이드 스크린이라서 요즘은 좀 신경이 쓰이지 않습니다.

if (pwbuf) sprintf(username,"%s",pwbuf->pw_name);
else       sprintf(username,"%d",user_id);

항상 화면에 가로 공간이 너무 많고 세로 공간이 부족한 것 같습니다!

또한 코드 블록에 이미 프리프로세서 명령어가 있는 경우에는 사용하지 마십시오.#if 0; 코드에 이미 블록 주석이 있는 경우 사용하지 마십시오./* */. 이미 둘 다 있는 경우에는 +가 있는 편집기에 의존하여 많은 줄을 설명합니다./만약 그렇지 않다면, 당신은 꽉 찼습니다. 코드를 완전히 삭제하세요!

if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);

관용적이고 간결합니다.2~3번 이상 닿으면 브라켓으로 하고 다음 줄로 하겠습니다.로깅 정보나 다른 조건을 추가하면 유지보수가 잘 되지 않습니다.

#if 0
....
#endif

디버그 코드의 블록을 켜는 것이 좋든 싫든 간에 좋습니다.또한 이런 종류의 코멘트를 차단하는 것과 관련된 컴파일 오류를 피할 수 있습니다.

/* line comment */
...
/* line comment again */

C 블록 댓글은 둥지를 틀지 않기 때문에.

코드의 대칭성을 지원하고 선이 너무 길어지지 않을 때 종종 더 간결한 스타일을 사용합니다.다음과 같은 작위적인 예를 들어보겠습니다.

if (strcmp(s, "foo") == 0)
{
    bitmap = 0x00000001UL;
    bit = 0;
}
else if (strcmp(s, "bar") == 0)
{
    bitmap = 0x00000002UL;
    bit = 1;
}
else if (strcmp(s, "baz") == 0)
{
    bitmap = 0x00000003UL;
    bit = 2;
}
else if (strcmp(s, "qux") == 0)
{
    bitmap = 0x00000008UL;
    bit = 3;
}
else
{
    bitmap = 0;
    bit = -1;
}

그리고 간결한 버전:

if      (strcmp(s, "foo") == 0) { bitmap = 0x00000001UL; bit = 0;  }
else if (strcmp(s, "bar") == 0) { bitmap = 0x00000002UL; bit = 1;  }
else if (strcmp(s, "baz") == 0) { bitmap = 0x00000003UL; bit = 2;  }
else if (strcmp(s, "qux") == 0) { bitmap = 0x00000008UL; bit = 3;  }
else                            { bitmap = 0;            bit = -1; }

벌레들은 여러분의 얼굴로 달려들 가능성이 훨씬 더 높습니다.

면책 사항:이 예는 내가 말했듯이 작위적인 것입니다.strcmp, magic number의 사용에 대해 자유롭게 논의하고 테이블 기반 접근 방식이 더 나을지 여부를 확인하십시오. ;)

#if는 별도로 작성된 조건을 확인하는 매크로이므로 '0'은 false를 나타내므로 '#if 0'과 '#endif' 사이에 작성된 코드 블록은 컴파일되지 않으므로 주석으로 처리할 수 있습니다.

그래서 기본적으로 프로그램에서 댓글을 작성할 때 0을 사용하면 #라고 말할 수 있습니다.

예:

#if 0
int a;
int b;
int c = a + b;
#endif

"#if 0"과 "#endif" 사이에 쓰여진 부분은 주석으로 간주됩니다.

"/* … */"는 프로그램에서 댓글을 작성하는 데 사용될 수 있는데 왜 "#if 0"인가요?

답변 : #0은 중첩댓글에 사용할 수 있지만 "/*"에서 중첩댓글이 지원되지 않는 경우... */" 때문입니다.

중첩 주석이란 무엇입니까?중첩 주석은 주석 아래에 있는 주석을 의미하며 다음과 같은 다양한 경우에 사용할 수 있습니다.

아래와 같은 코드를 작성한 예를 들어 보겠습니다.

enter image description here

지금, 누군가가 당신의 코드를 검토하고 있고, 당신의 프로그램에 이 코드 전체를 언급하고 싶어합니다. 왜냐하면 그는 이 코드가 필요하지 않기 때문입니다.이를 위한 일반적인 접근 방식은 다음과 같습니다.

enter image description here

위의 내용은 내포된 주석의 예시입니다.위 코드의 문제는 "/" 뒤의 첫 번째 "/"가 마주치는 순간 코멘트가 거기서 끝난다는 것입니다. 즉, 위 예에서 문장 int d = a-b;는 코멘트되지 않습니다.

이는 "if 0"을 사용하여 해결됩니다.

enter image description here

여기서는 #if 0을 사용하여 중첩 주석을 사용했습니다.

사용하는 몇 가지 이유를 말할 수 있습니다.#if 0:

  • 댓글은 둥지를 틀지 않습니다.#if지시자가 합니다.

  • 보다 편리한 기능:비활성화된 코드 블록을 일시적으로 활성화하려면#if 0당신은 단지 다음과 같이 하면 됩니다.1대신에0.와 함께/* */당신은 둘 다 제거해야 합니다./*그리고.*/;

  • 대신 의미있는 매크로를 넣을 수 있습니다.0,맘에 들다ENABLE_FEATURE_FOO;

  • 자동화된 포맷 도구는 내부의 코드를 포맷합니다.#if차단하지만 주석 처리된 코드는 무시합니다.

  • 더 쉽게 찾아갈 수 있습니다#if의견을 찾는 것보다.

  • 원래 코드를 터치하지 않고 그 주변에 줄만 추가하기 때문에 VCS에서 더 잘 재생됩니다.

#if 0 ... #endif오래된 C 코드에서는 꽤 흔합니다.그 이유는 C 스타일의 댓글로 댓글을 달기 때문입니다./* .... */댓글이 둥지를 틀지 않아서 안 됩니다.

일반적인 일이지만 현대 코드에 자리가 없다고 생각합니다.옛날에는 텍스트 편집자가 댓글의 큰 부분을 자동으로 차단할 수 없었기 때문에 그렇게 했습니다.더 중요한 것은, 그들이 지금처럼 제대로 된 소스 코드 제어를 하지 못했다는 것입니다.생산코드에 댓글이나 #ifdef'를 남겨도 변명의 여지가 없습니다.

언급URL : https://stackoverflow.com/questions/3630601/why-use-if-0-for-block-commenting-out

반응형