source

(다른 플랫폼에서) NDEBUG 전처리기 매크로는 무엇에 사용됩니까?

manysource 2023. 6. 14. 21:56

(다른 플랫폼에서) NDEBUG 전처리기 매크로는 무엇에 사용됩니까?

다양한 플랫폼/컴파일러("구현")/프레임워크가 C와 C++ 프리프로세서 매크로에 어떤 목적으로 할당되는지 관심이 있습니다.NDEBUG.

C와 C++ 표준은 이 정의를 한 번만 언급합니다. 즉, 동작을 제어하는 것입니다.assert()거시적인

C 또는 C++ 특정 플랫폼/프레임워크/라이브러리가 다음을 사용한다는 것을 알고 있는 특정 답변만 포함할 것을 요청합니다.NDEBUG표준 정의 매크로 외에 다른 모든 것을 활성화하거나 비활성화할 수 있습니다.

이 질문을 하는 한 가지 이유는 MS(Visual-C++)가 디버그와 릴리스 항목을 구별하기 위해 항상 "그들의" 정의를 사용하기 때문입니다. 저는 이것이 라이브러리/플랫폼이 "자신의" 디버그를 정의하는 일반적인 관행인지 또는 다른 라이브러리/플랫폼이 사용하는지 궁금합니다.NDEBUG디버그 관련 정보를 제공합니다.

'준인한 '것은 '에 대한한 '것.NDEBUG그것은 그것이 그것을 통제하는 데 사용된다는 것입니다.assert매크로는 검사를 수행하거나 수행하지 않는 매크로로 확장됩니다. MSVC는 프로젝트에서 이 매크로를 정의하여 릴리스 빌드 구성에서 유용하게 정의합니다.프로젝트 구성을 편집하여 수동으로 변경할 수 있습니다.다른 툴 체인에서도 비슷한 작업을 수행할 수 있습니다(또는 수행하지 않을 수 있습니다.

로 상를변 있다니습의 .NDEBUG 단위 파일)내를 사용하여 번역합니다.#define 및/는#undefNDEBUG그리고 다시 시작합니다.assert.h방법을 바꾸기 위해assert매크로가 동작합니다(설정 및 해제).이 동작은 표준에 의해 의무화되며 표준 헤더를 두 번째 포함 후 컴파일 동작을 변경할 수 있도록 표준 헤더를 두 번째 포함하는 것이 허용되는 유일한 시간이라고 생각합니다.

그것은 문제가 되는 프레임워크의 유지 관리자에게 달려 있는 결정입니다.그런 결정들은 바뀔 수 있기 때문에, 당신이 의지할 것이 없습니다.저는 NDEBUG를 디버그와 관련된 모든 것(예: 추적 출력)에 대한 토글로 사용하지만, 다음 릴리스에서는 마음이 바뀔 수도 있습니다.주어진 프로젝트에서 사용하는 프레임워크의 API 문서를 확인하는 것을 대체할 수 있는 답변은 없습니다.

즉, 라이브러리/프레임워크 헤더에서 NDEBUG를 사용하여 다음을 제외한 모든 을 수행합니다. assert()다소 멍청한 디자인 결정이 될 것입니다.응용 프로그램 프로그래머는 라이브러리 또는 프레임워크의 헤더를 포함하기 전/후에 적합하다고 판단되는 경우 NDEBUG를 설정/해제할 수 있으므로 lib/framework 유지 관리자는 릴리스 lib로 설정되거나 디버깅 lib로 설정되지 않은 NDEBUG에 의존할 수 없습니다.나는 어떤 중요한 프로젝트도 그런 식으로 엔디버그에 의존했을지 의심스럽습니다.

언급URL : https://stackoverflow.com/questions/5473556/what-is-the-ndebug-preprocessor-macro-used-for-on-different-platforms