왜 누군가가 사용하는 경우#1C 전처리기는 지침?
-
20-09-2019 - |
문제
내가 찾는 일부를 C 소스 코드 및 내가 이해하지 못하는 다음과 같은 부분
#if 1
typedef unsigned short PronId;
typedef unsigned short LMId;
# define LM_NGRAM_INT
#else
typedef unsigned int LMId;
typedef unsigned int PronId;
# undef LM_NGRAM_INT
#endif
왜 사람이 하시 #if 1
?진실하지 않는 첫 번째 블록이 이제까지 처리할?
해결책
예 .. 첫 번째 블록 만 처리됩니다. 누군가가 1을 0으로 변경할 때까지 다른 블록이 컴파일됩니다. 이것은 다른 알고리즘을 테스트하는 동안 코드의 임시 스위치 블록을 임시로 스위치 블록으로 만드는 편리한 방법입니다.
다른 팁
변경하여 컴파일 할 부품을 신속하게 선택할 수 있도록 #if 1
에게 #if 0
.
하나의 기본적인 속성의 소프트웨어 컴퓨터 프로그램은 저렴한 수정.
그 이유는 특정 코드를 작성하는 방식으로 만들 것입 수정을 더 쉽습니다.그 이유는 그들이 필요로 다양한 패턴,다음과 같"인터페이스",또는"프록시".
고 그런 이유로 당신은 때로는 참 이상한 구조 #if 1
-#else
-#endif
, 는 유일한 목적의하는 것입니다 쉽게 전환하는 부분의 코드를 컴파일하여,작은 노력이:변화 1 0.
다른 매개 변수 세트를 테스트해야 할 때 코드에 넣습니다. 일반적으로 내 제품은 디버그 환경에서 작업 할 수있는 것과 다른 기본값으로 배송되므로 배송 기본값을 #IF 1에 넣고 #ELSE의 디버그 기본값을 #WARNING과 함께 디버그로 구축하고 있다고 경고합니다. 기본값.
다양한 코드 경로를 실험합니다.
큰 코드 조각을 주석화하는 다른 방법이므로, 편집기 자동 인간화는 들여 쓰기를 중단하지 않을 것입니다 (주석은 코드 블록이 코드가 아닌 텍스트로 들여 쓰기).
실제로 코드 폴딩을 더 쉽게 만들기 위해 Kludge로 사용하고 있습니다. 코드 섹션을 #if 1 ... #endif
, 편집자로 접을 수 있습니다. (문제의 코드는 매우 거시적이며 나에 의해 작성되지 않았으므로 엄청난 코드 블록을 관리하는 전통적인 방법은 작동하지 않습니다.)
그것은 또 다른 방법입니다 #사실이면 이전에 다른 기호를 확인한 후 항상 사실이되도록 리팩토링 된 코드의 결과 일 가능성이 높습니다.
더 깨끗한 방법은 아마도 다음과 같은 일을하는 것입니다.
#if ALGO1
#else
#endif
그러나, 당신은 Algo1을 컴파일러 Args에 어딘가에 전달해야합니다 ... 예를 들어, makefile에서는 -dalgo1 = 1을 추가해야합니다 (No 1이 제공되면 1이 가정됩니다). ref : http://www.amath.unc.edu/sysadmin/doc4.0/c-compiler/user_guide/cc_options.doc.html
이것은 더 많은 작업입니다 ... 따라서 일반적으로 빠른 확인을 위해 #if 1이 사용됩니다. 그리고 어떤 경우에는 잊혀지고 뒤에도 남았습니다 :-)