[c-preprocessor] #if 0… #endif 블록은 정확히 무엇을합니까?

에서 C / C ++

#if 0/ #endif블록 사이에있는 코드는 어떻게됩니까 ?

#if 0

//Code goes here

#endif

코드가 단순히 건너 뛰어 실행되지 않습니까?



답변

실행되지 않을뿐만 아니라 컴파일되지도 않습니다.

#if실제 컴파일 단계 전에 평가되는 전 처리기 명령입니다. 해당 블록 내부의 코드는 컴파일 된 바이너리에 나타나지 않습니다.

나중에 다시 켜기 위해 코드 세그먼트를 일시적으로 제거하는 데 자주 사용됩니다.


답변

한 가지 중요한 차이점을 제외하면 블록을 주석 처리하는 것과 동일합니다. 중첩은 문제가되지 않습니다. 이 코드를 고려하십시오.

foo();
bar(x, y); /* x must not be NULL */
baz();

주석을 달고 싶다면 다음을 시도해 볼 수 있습니다.

/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/

Bzzt. 구문 오류! 왜? 블록 코멘트 (당신이 SO의 구문 강조에서 볼 수있는 바와 같이) 그렇게하지 둥지 등을 할 수 있기 때문에 */단어 “NULL”후가 만드는 코멘트를 종료 baz주석하지 전화를하고, */이후에 baz구문 오류입니다. 반면에 :

#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif

전체 내용을 주석 처리합니다. 그리고 #if 0s는 다음과 같이 서로 중첩됩니다.

#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif

물론 이것은 약간 혼란 스러울 수 있고 제대로 설명하지 않으면 유지 관리 문제가 될 수 있습니다.


답변

컴파일러가 컴파일하지 않도록 해당 코드를 영구적으로 주석 처리합니다.

코더는 나중에 원할 경우 프로그램에서 해당 코드를 컴파일하도록 #ifdef를 변경할 수 있습니다.

코드가 존재하지 않는 것과 똑같습니다.


답변

#if 0… #endif 블록은 정확히 무엇을합니까?

작성자가 버전 제어 시스템에 대해 들어 본 적이 없음을 알려줍니다. 그러면 가능한 한 멀리 달아 나라는 메시지가 표시됩니다.


답변

#else케이스 에 추가하고 싶습니다 .

#if 0
   /* Code here will NOT be complied. */
#else
   /* Code will be compiled. */
#endif


#if 1
   /* Code will be complied. */
#else
   /* Code will NOT be compiled. */
#endif


답변

전처리 기가 #을 볼 때 다음 토큰이 0이 아닌 값을 가지고 있는지 확인합니다. 그렇다면 컴파일러를위한 코드를 유지합니다. 그렇지 않은 경우 해당 코드를 제거하므로 컴파일러가 코드를 볼 수 없습니다.

누군가가 #if 0이라고 말하면 코드를 효과적으로 주석 처리하므로 컴파일되지 않습니다. 당신은 이것을 주변에 / * … * /를 넣은 것처럼 생각할 수 있습니다. 동일하지는 않지만 효과는 동일합니다.

무슨 일이 일어 났는지 자세히 이해하고 싶다면 자주 볼 수 있습니다. 많은 컴파일러를 사용하면 전처리 기가 실행 된 후 파일을 볼 수 있습니다. 예를 들어 Visual C ++에서 switch / P 명령은 전처리기를 실행하고 결과를 .i 파일에 저장합니다.


답변

a #로 시작하는 행 은 전 처리기 지시문 입니다. #if 0 [...] #endif블록은 컴파일러에 전달되지 않으며 기계어 코드를 생성하지 않습니다.

소스 파일을 사용하여 전처리 기가 어떻게되는지 보여줄 수 있습니다 ifdef.cxx.

#if 0
This code will not be compiled
#else
int i = 0;
#endif

실행 gcc -E ifdef.cxx하면 컴파일되는 내용이 표시됩니다.

이 메커니즘을 사용하여 개발주기 동안 코드 블록이 컴파일되는 것을 방지 할 수 있지만 소스 제어에 체크인하는 것을 원하지 않을 것입니다. 코드가 복잡해지고 가독성이 떨어질뿐입니다. 주석 처리 된 코드의 역사적 조각이라면 제거해야합니다. 소스 제어에는 기록이 포함되어 있습니다.

또한 대답은 CC ++ 모두 동일 할 수 있지만 C / C ++라는 언어가 없으며 이러한 언어를 참조하는 것은 좋은 습관이 아닙니다.