조건부 컴파일의 바로 가기로 C / C ++ 매크로를 사용하는 것이 좋습니다?


13

내 코드에 여러 유형의 출력 메시지를 원한다고 가정 해 봅시다. 그중 하나는 DEBUG코드가 디버그 모드에서 컴파일 될 때만 인쇄됩니다.

보통은 다음과 같은 것을 작성해야합니다

#ifdef DEBUG
    std::cout << "Debug message" << std::endl;
#endif

많은 장소에서 사용하기가 번거롭고 성가시다.

코드 스 니펫에 대한 매크로를 정의하는 것이 좋은 방법이므로이 방법으로 사용 하시겠습니까?

MSG_DEBUG("Debug message")

아니면 매크로없이 처리하는 다른 더 우아한 방법이 있습니까? 다른 프로젝트에서 두 언어를 모두 사용하기 때문에 C 및 C ++의 가능한 솔루션에 관심이 있습니다.



조건부 코드를 함수에 넣고 호출하지 않는 이유는 분명하지 않습니다. 이를 막을 수있는 다른 제약이 있습니까?
Alex

@gnat 당신이 언급 한 질문은 너무 광범위해서, 대부분의 사람들은 특히 인터넷에서이 특정한 질문을 볼 때이 주제와 관련이 없을 것입니다.
Eenoku

3
귀하의 질문에 cc ++ 태그가 지정되어 있지만 언어가 다릅니다. 당신이 말하고있는 것을 명확히 할 수 있습니까? 귀하의 예제는 C에서는 완벽하지만 constexpr ifC ++에서는 더 잘 구현 될 수 있습니다 .
Jörg W Mittag

1
따로 진단은로 이동해야합니다 STDERR. 또한, 왜에 의존하지 NDEBUG같은 assert()대신합니까? 그런 다음 #define DEBUG_MSG(MSG) assert(std::cerr << MSG)스트림 상태를 테스트하는 것과 같이 정의 할 수 있습니다.
중복 제거기

답변:


19

물론, 처음에 매크로를 사용하는 것이 좋다면 동일한 조건부 코드를 계속 반복하는 대신 매개 변수가있는 것을 정의하는 것이 좋은 코딩의 척도로 바람직합니다.

매크로를 사용해야합니까? 내 견해로는 C로 받아 들여지기 때문에 매크로가없는 솔루션은 디버그 모드 외부에서도 적어도 무언가 를 실행 해야하기 때문 입니다. 일반적인 C 프로그래머는 언제든지 불필요한 런타임 노력에 비해 약간 못생긴 매크로를 선택합니다.


13

여기에는 개인 취향 요소가 있지만 C ++에서는 헤더 파일 에서이 작업을 선호합니다.

#ifdef _DEBUG
    void DebugMessage(...);
#else
    inline void DebugMessage(...) {}
#endif

따라서 릴리스 빌드에서는 함수가 인라인으로 표시되지만 디버그 빌드에서는 적절한 함수이므로 적절한 유형 확인, 적절한 오류 메시지 등이 있으며 나중에 추가 기능 (로깅 가능 여부)을 추가 할 수 있습니다.

분명히, .cpp파일에있는 함수의 해당 정의를 #ifdef _DEBUG블록 으로 묶어야합니다 .


그러나 통화 오버 헤드가 여전히 존재합니까?
Eenoku

7
컴파일러가 릴리스 빌드에서 알려진 빈 함수를 호출하는 코드를 생성하는 경우 효율성을 개선하기 위해 가장 먼저해야 할 일은 훨씬 더 나은 컴파일러를 얻는 것입니다. 이것은 실제로 사소한 최적화입니다.
David Thornley

@Eenoku 아니요, David가 말했듯이 사용해야하는 컴파일러가 제거합니다.
Jack Aidley

3
여기서 중요한 차이점은 매크로 작성 방법에 따라 매크로가 인수 표현식을 평가하지 않지만 함수는 항상 그렇지 않다는 것입니다. 또한 사소하지 않은 인수를 varargs 함수에 전달하고 일반적으로 컴파일러 경고를 트리거하는 것은 정의되지 않은 동작입니다.
Sebastian Redl


2

확실히, 팀에서 제공 한 코드 지침을 따르지 않도록하십시오. 시스템의 다른 코드가 일반 if 조건을 통해 동일한 기능에 도달하지 않도록하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.