_DEBUG vs NDEBUG
코드의 디버그 섹션을 지정하기 위해 어떤 프리 프로세서 정의를 사용해야합니까?
#ifdef _DEBUG
또는 사용 #ifndef NDEBUG
하는 것이 더 좋은 방법이 #define MY_DEBUG
있습니까?
_DEBUG
Visual Studio와 관련이 있다고 생각합니다. NDEBUG가 표준입니까?
Visual Studio는 or 옵션 _DEBUG
을 지정할 때 정의 하고 standard-C 어설 션을 비활성화합니다. 적절한 경우, 즉 디버깅 코드가 MS CRT 디버깅 기술 과 일관성을 유지하고 싶을 때 사용하십시오 ./MTd
/MDd
NDEBUG
_DEBUG
NDEBUG
assert()
고유 한 디버깅 매크로를 정의하고 (컴파일러 또는 C 런타임을 해킹하지 않는 경우) 밑줄로 이름을 시작하지 마십시오.
NDEBUG
컴파일러와 구현에서 동작이 표준화 된 유일한 프로그램이기 때문에 에 의존 합니다 (표준 어설 션 매크로에 대한 설명서 참조). 부정적인 논리는 작은 가독성 스피드 범프이지만 빠르게 적응할 수있는 일반적인 관용구입니다.
비슷한 것에 의존하는 것은 _DEBUG
특정 컴파일러 및 라이브러리 구현의 구현 세부 사항에 의존하는 것입니다. 다른 컴파일러는 동일한 규칙을 선택하거나 선택하지 않을 수 있습니다.
세 번째 옵션은 프로젝트에 고유 한 매크로를 정의하는 것입니다. 이는 상당히 합리적입니다. 고유 한 매크로를 사용하면 여러 구현에서 이식성을 제공 할 수 있으며 어설 션과 독립적으로 디버깅 코드를 활성화하거나 비활성화 할 수 있습니다. 일반적으로 컴파일 타임에 활성화되는 다른 클래스의 디버깅 정보를 사용하지 않는 것이 좋습니다. 왜냐하면 작은 이점을 위해 빌드 (및 테스트) 해야하는 구성 수가 증가하기 때문입니다.
이러한 옵션 중 하나를 사용하여 프로젝트의 일부로 타사 코드를 사용하는 경우 어떤 규칙을 사용하는지 알고 있어야합니다.
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는 assert () 문의 활성화 여부를 제어합니다.
내 견해로는 다른 디버깅과는 별개이므로 NDEBUG 이외의 다른 것을 사용하여 프로그램의 디버깅 정보를 제어합니다. 내가 사용하는 것은 작업중인 프레임 워크에 따라 다릅니다. 시스템마다 다른 활성화 매크로가 있으며 적절한 것을 사용합니다.
프레임 워크가 없으면 밑줄없이 이름을 사용합니다. 그것들은 '구현'으로 예약되는 경향이 있으며 이름 충돌과 관련된 문제를 피하려고합니다-이름이 매크로 일 때 두 배로.
일관성 있고 어느 것이 중요하지 않습니다. 또한 어떤 이유로 특정 DEBUG 식별자를 사용하여 다른 프로그램이나 도구와 상호 작용 해야하는 경우 쉽게 수행 할 수 있습니다
#ifdef THEIRDEBUG
#define MYDEBUG
#endif //and vice-versa
불행하게도 "DEBUG"는 과도하게 과부하되었습니다. 예를 들어, RELEASE 빌드를 위해 항상 pdb 파일을 생성하고 저장하는 것이 좋습니다. -Zx 플래그 및 -DEBUG 링커 옵션 중 하나를 의미합니다. _DEBUG는 malloc 및 free 호출과 같은 런타임 라이브러리의 특수 디버그 버전과 관련이 있습니다. 그러면 NDEBUG가 어설 션을 비활성화합니다.
참고 URL : https://stackoverflow.com/questions/2290509/debug-vs-ndebug
'Programing' 카테고리의 다른 글
HTML5가 HTML 주석 표준을 변경합니까? (0) | 2020.07.01 |
---|---|
각 객체에 대해 일반 저장소와 특정 저장소를 작성하는 이점 (0) | 2020.07.01 |
C ++에서 컴파일 타임 문자열을 편리하게 선언 (0) | 2020.07.01 |
언제 그리고 언제 angular.copy를 사용해야합니까? (0) | 2020.07.01 |
위치와 함께 작동하지 않는 'transform3d': 고정 하위 (0) | 2020.07.01 |