에서 C / C ++
#if 0
/ #endif
블록 사이에있는 코드는 어떻게됩니까 ?
#if 0
//Code goes here
#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 0
s는 다음과 같이 서로 중첩됩니다.
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
물론 이것은 약간 혼란 스러울 수 있고 제대로 설명하지 않으면 유지 관리 문제가 될 수 있습니다.
foo.c:3: unterminated string or character constant
gcc에서 얻었습니다. 무엇을 사용하고 있습니까?
#if 0… #endif 블록은 정확히 무엇을합니까?
작성자가 버전 제어 시스템에 대해 들어 본 적이 없음을 알려줍니다. 그러면 가능한 한 멀리 달아 나라는 메시지가 표시됩니다.
전처리 기가 #을 볼 때 다음 토큰이 0이 아닌 값을 가지고 있는지 확인합니다. 그렇다면 컴파일러를위한 코드를 유지합니다. 그렇지 않은 경우 해당 코드를 제거하므로 컴파일러가 코드를 볼 수 없습니다.
누군가가 #if 0이라고 말하면 코드를 효과적으로 주석 처리하므로 컴파일되지 않습니다. 당신은 이것을 주변에 / * ... * /를 넣은 것처럼 생각할 수 있습니다. 동일하지는 않지만 효과는 동일합니다.
무슨 일이 일어 났는지 자세히 이해하고 싶다면 자주 볼 수 있습니다. 많은 컴파일러를 사용하면 전처리 기가 실행 된 후 파일을 볼 수 있습니다. 예를 들어 Visual C ++에서 switch / P 명령은 전처리기를 실행하고 결과를 .i 파일에 저장합니다.
#if WIN32 || __CYGWIN__
없지만 예상대로 작동합니다.
a #
로 시작하는 행 은 전 처리기 지시문 입니다. #if 0 [...] #endif
블록은 컴파일러에 전달되지 않으며 기계어 코드를 생성하지 않습니다.
소스 파일을 사용하여 전처리 기가 어떻게되는지 보여줄 수 있습니다 ifdef.cxx
.
#if 0
This code will not be compiled
#else
int i = 0;
#endif
실행 gcc -E ifdef.cxx
하면 컴파일되는 내용이 표시됩니다.
이 메커니즘을 사용하여 개발주기 동안 코드 블록이 컴파일되는 것을 방지 할 수 있지만 소스 제어에 체크인하는 것을 원하지 않을 것입니다. 코드가 복잡해지고 가독성이 떨어질뿐입니다. 주석 처리 된 코드의 역사적 조각이라면 제거해야합니다. 소스 제어에는 기록이 포함되어 있습니다.
또한 대답은 C 와 C ++ 모두 동일 할 수 있지만 C / C ++라는 언어가 없으며 이러한 언어를 참조하는 것은 좋은 습관이 아닙니다.
좀 빠지는
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
gcc 4.2.4에서 "tc : 4 : 19 : warning : missing terminating 'character"를 표시합니다.
//
거나 섹션을로 시작하고 섹션을/*
로 끝내야합니다*/
. 후자의 기술의 문제점은 주석이 중첩되지 않기 때문에 개발자가*/
시작과 끝 사이에 모든 것을 확인하고 처리해야한다는 것 입니다.