답변:
Visual Studio는 또는 옵션 _DEBUG
을 지정할 때 정의 하고 표준 C 어설 션을 비활성화합니다. 적절한 경우, 즉 디버깅 코드가 MS CRT 디버깅 기술 과 일관성을 유지하고 싶을 때 사용하십시오 ./MTd
/MDd
NDEBUG
_DEBUG
NDEBUG
assert()
고유 한 디버깅 매크로를 정의하고 (컴파일러 또는 C 런타임을 해킹하지 않는 경우) 밑줄로 이름을 시작하지 마십시오.
NDEBUG가 표준입니까?
예, C89, C99, C ++ 98, C ++ 2003, C ++ 2011, C ++ 2014 표준에 대한 "Not Debug"의미의 표준 매크로입니다. _DEBUG
표준 에는 매크로 가 없습니다 .
C ++ 2003 표준은 "17.4.2.1 헤더"의 "326 페이지"에있는 리더를 표준 C로 보냅니다.
NDEBUG는 표준 C 라이브러리와 동일합니다.
"4.2 DIAGNOSTICS"섹션의 C89 (이 표준을 표준 C라고 함)
http://port70.net/~nsz/c/c89/c89-draft.html
포함 된 소스 파일의 지점에서 NDEBUG가 매크로 이름으로 정의되면 어설 션 매크로는 다음과 같이 간단하게 정의됩니다.
#define assert(ignore) ((void)0)
_DEBUG
Visual Studio https://msdn.microsoft.com/en-us/library/b0084kay.aspx 에서 매크로
의 의미를 살펴보면
이 매크로는 언어 런타임 라이브러리 버전 선택에 의해 자동으로 정의됩니다.
NDEBUG
컴파일러와 구현에서 동작이 표준화 된 유일한 프로그램이기 때문에 에 의존 합니다 (표준 어설 션 매크로에 대한 설명서 참조). 부정적인 논리는 작은 가독성 스피드 범프이지만 빠르게 적용 할 수있는 일반적인 관용구입니다.
비슷한 것에 의존하는 것은 _DEBUG
특정 컴파일러 및 라이브러리 구현의 구현 세부 사항에 의존하는 것입니다. 다른 컴파일러는 동일한 규칙을 선택하거나 선택하지 않을 수 있습니다.
세 번째 옵션은 프로젝트에 고유 한 매크로를 정의하는 것입니다. 이는 상당히 합리적입니다. 고유 한 매크로를 사용하면 여러 구현에서 이식성을 제공 할 수 있으며 어설 션과 독립적으로 디버깅 코드를 활성화하거나 비활성화 할 수 있습니다. 일반적으로 컴파일 타임에 활성화되는 다양한 클래스의 디버깅 정보를 사용하지 않는 것이 좋습니다. 왜냐하면 작은 이점을 위해 빌드 (및 테스트) 해야하는 구성 수가 증가하기 때문입니다.
이러한 옵션 중 하나를 사용하여 프로젝트의 일부로 타사 코드를 사용하는 경우 어떤 규칙을 사용하는지 알고 있어야합니다.
#if !defined(NDEBUG)
<-@HostileFork가 그게 무슨 뜻입니까? #if
아닙니다 #ifdef
?
#ifdef NDEBUG
#if !defined(NDEBUG)
#ifndef NDEBUG
매크로 NDEBUG
는 assert()
명령문의 활성 여부를 제어합니다 .
내 생각에는 다른 디버깅과는 별개이므로 NDEBUG
프로그램에서 디버깅 정보를 제어 하는 것 이외의 다른 것을 사용 합니다. 내가 사용하는 것은 작업중인 프레임 워크에 따라 다릅니다. 시스템마다 다른 활성화 매크로가 있으며 적절한 것을 사용합니다.
프레임 워크가 없으면 밑줄없이 이름을 사용합니다. 그것들은 '구현'으로 예약되는 경향이 있으며 이름 충돌과 관련된 문제를 피하려고합니다-이름이 매크로 일 때 두 배로.
#if
통제 코드 를 넣는 것과는 다릅니다 . 아마 그렇지 않은 assert(huge_object.IsValid());
동안 느려질 수 있습니다 assert(ptr != nullptr);
. 나는 대규모 프로젝트에서 로깅 및 추적 이 어설 션과 구별되어야함에 동의 하지만 로깅 또는 추적 을 디버그 코드로 생각하지 않으므로 설명을 요청했습니다.