이 장을 시작할 때 _Static_assert와 static_assert를 본 적이 있다. 컴파일 시간에 실행되는 어서션을 만들 때 사용하는 구문이며, 모든 종류의 컴파일 시간 불 표현식을 검사할 수 있다. assert.h에는 assert와 NDEBUG란 것도 제공하는데, 런타임 어서션에 사용된다. assert는 특정한 순간에 반드시 만족해야 하는 표현식을 검사할 때 사용한다. 이 구문에 모든 종류의 불 표현식을 담을 수 있으며 동적 표현식도 사용할 수 있다. 컴파일 시점에 NDEBUG 매크로가 정의되어 있지 않으면 실행될 때마다 이 매크로에서 지정한 표현식을 평가한다. 7.3절에서 본 gcd와 gcd2 함수에 assert를 사용하는 전형적인 예가 나온다. 즉, 실행할 때마다 반드시 만족해야 할 조건을 지정하는 것이다.
이렇게 지정한 조건이 만족하지 않으면 진단 메시지를 출력한 뒤 abort를 호출한다. 그래서 이런 코드는 프로덕션 단계의 실행 파일에 포함되면 안 된다. 앞에서 설명했듯이 abort를 사용하는 것이 좋지 않을 때가 많다. 또한 최종 고객이 다음과 같은 메시지를 보게 되는 것도 그리 바람직하지 않을 것이다.
터미널
0 assertion failed in file euclid.h, function gcd2(), line 6
디버깅 단계에서는 이런 정보를 보고 변수 값을 잘못 사용한 지점을 정확히 짚어낼 수 있어서 매우 유용하다.
TAKEAWAY 8.27 assert문을 최대한 많이 사용하여 런타임 속성을 확인할 수 있도록 한다.
앞에서 설명했듯이 NDEBUG는 표현식을 평가하고 abort를 호출하는 작업을 취소한다. 오버헤드를 줄이고 싶다면 이 기능을 사용하면 된다.
TAKEAWAY 8.28 프로덕션 버전을 컴파일할 때는 NDEBUG를 이용하여 assert문을 모두 끈다.