많은 질문에 관해서는,이 질문에 대한 답은 의지에 달려 있습니다. 어느 것이 더 낫다고 말하는 대신 , 하나가 다른 것보다 나은 예제와 목표를 부여했습니다.
전처리 기와 상수 모두 적절한 사용 장소가 있습니다.
전 처리기의 경우 코드는 컴파일 시간 전에 제거됩니다. 따라서 코드가 컴파일되지 않을 것으로 예상되는 상황에 가장 적합합니다 . 이는 모듈 구조, 종속성에 영향을 줄 수 있으며 성능 측면에서 최상의 코드 세그먼트를 선택할 수 있습니다. 다음과 같은 경우에는 전처리기만 사용하여 코드를 나누어야합니다.
다중 플랫폼 코드 :
예를 들어, 코드가 다른 플랫폼에서 컴파일 될 때 코드가 특정 버전의 OS (또는 컴파일러 버전)에 종속되는 경우 (매우 드물지만) 예를 들어 little-endien big-endien 코드를 처리 할 때는 상수가 아닌 전처리기로 분리해야합니다. 또는 Windows뿐만 아니라 Linux 용 코드를 컴파일하는 경우 특정 시스템 호출이 매우 다릅니다.
실험용 패치 :
또 다른 이유는 정당화되는 것입니다. 위험한 실험용 코드 나 중요한 주요 모듈을 생략해야하는데, 이는 중요한 연결 또는 성능 차이가 있습니다. if () 아래에 숨기지 않고 프리 프로세서를 통해 코드 를 비활성화 하려는 이유 는이 특정 변경 세트로 인해 발생한 버그를 확신 할 수없고 실험적으로 실행되기 때문입니다. 실패하면 다시 작성하는 것보다 프로덕션에서 해당 코드를 비활성화 해야합니다 . 언젠가 는 전체 코드를 주석 처리 하는 데 이상적입니다 .#if 0
종속성 다루기 :
생성해야 할 또 다른 이유 예를 들어 JPEG 이미지를 지원하지 않으려는 경우 해당 모듈 / 스텁을 컴파일하지 않으면 라이브러리가 (정적으로 또는 동적으로) 링크되지 않습니다. 구성 단위. 때때로 패키지 ./configure
는 이러한 종속성의 가용성을 식별하기 위해 실행 되며 라이브러리가 없거나 (또는 사용자가 활성화하지 않으려는 경우) 해당 기능은 해당 라이브러리와 연결하지 않고 자동으로 비활성화됩니다. 이러한 지시어가 자동으로 생성되면 항상 유리합니다.
라이센싱 :
전 처리기 지시문의 흥미로운 예 중 하나는 ffmpeg 입니다. 사용함으로써 특허를 침해 할 가능성이있는 코덱이 있습니다. 소스를 다운로드하고 컴파일하여 설치하면 그러한 것을 원하는지 또는 멀리할지 묻습니다. 조건이 여전히 귀하를 법정에 착륙시킬 수 있는 경우 코드를 숨기십시오 !
코드 복사-붙여 넣기 :
일명 매크로. 이것은 매크로를 과도하게 사용하는 것에 대한 조언이 아닙니다. 매크로는 복사하여 과거에 해당하는 것을 훨씬 더 강력하게 적용 할 수 있다는 것 입니다. 그러나주의해서 사용하십시오. 하고있는 일을 알고 있다면 사용하십시오. 물론 상수는 이것을 할 수 없습니다. 그러나 inline
쉬운 경우 기능을 사용할 수도 있습니다 .
그래서 언제 상수를 사용합니까?
거의 다른 곳.
더 깔끔한 코드 흐름 :
일반적으로 상수를 사용할 때 일반 변수와 거의 구별 할 수 없으므로 코드를 더 잘 읽을 수 있습니다. 75 줄의 루틴을 작성하는 경우 #ifdef가있는 10 줄마다 매우 읽을 수없는 3 줄 또는 4 줄이 있습니다. 아마도 #ifdef에 의해 통제되는 1 차 상수가 주어 졌을 때, 어디서나 자연스럽게 사용할 수 있습니다.
잘 들여 쓰기 된 코드 : 모든 프리 프로세서 지시문은 잘 들여 쓰기 된 코드 와 잘 작동하지 않습니다 . 하더라도 당신의 컴파일러가 #def의 들여 쓰기를 허용하지, 사전 ANSI C 프리 프로세서는 라인과 "#"문자의 시작 사이의 공간을 허용하지 않았다; 선행 "#"은 항상 첫 번째 열에 배치해야합니다.
구성 :
상수 또는 변수가 의미가있는 또 다른 이유는 전역에 연결되거나 쉽게 구성 파일에서 파생되도록 확장 될 수 있기 때문입니다.
마지막 한 가지 : 전
범위 지시어 나 범위 를 교차하는 데 전 처리기 지시문 을
사용하지 마십시오 . 즉 ,의 다른면에서 시작 또는 끝 . 이것은 매우 나쁘다. 혼란스럽고 언젠가 위험 할 수 있습니다.#ifdef
#endif
{ ... }
#ifdef
#endif
{ ... }
물론 이것은 완전한 목록은 아니지만 어떤 방법을 사용하는 것이 더 큰 차이를 보여줍니다. 그것은 실제로 어느 것이 더 나은지 에 관한 것이 아니며 , 주어진 맥락에서 사용하기에 더 자연스러운 것입니다.