2.5.3. 프로그램에서 종료

프로그램은 main() 끝에서 정상적으로 종료되거나 오류로 인해 조기에 종료할 수 있습니다.

assert에서 종료

assert 매크로의 동작은 #include <assert.h>가 발생한 가장 최근의 작업 조건에 따라 달라집니다.

  1. NDEBUG 매크로가 명령 행에서 또는 소스 파일의 일부로 정의되면 assert 매크로는 아무 영향을 미치지 않습니다.

  2. NDEBUG 매크로가 정의되지 않으면 assert 식(assert 매크로에 제공된 식)이 평가됩니다. 결과가 TRUE(!= 0)이면 assert 매크로는 더 이상 아무 영향을 미치지 않습니다.

  3. assert 식이 FALSE로 평가되면 다음 중 하나에 해당하는 경우 assert 매크로가 __aeabi_assert() 함수를 호출합니다.

    • --strict를 사용하여 컴파일하고 있습니다.

    • -O0 또는 -O1을 사용하고 있습니다.

    • --library_interface=aeabi_clib 또는 --library_interface=aeabi_glibc를 사용하여 컴파일하고 있습니다.

    • __ASSERT_MSG가 정의되어 있습니다.

    • _AEABI_PORTABILITY_LEVEL이 정의되어 있으며 0이 아닙니다.

  4. 그렇지 않으면 assert 식이 FALSE로 평가되고 위의 3번에 지정된 조건에 해당되지 않는 경우 assert 매크로는 abort()를 호출합니다. 그런 후 다음을 수행합니다.

    1. abort()__rt_raise()를 호출합니다.

    2. __rt_raise()가 반환되면 abort()가 라이브러리를 종료하려고 합니다.

라이브러리를 사용하지 않는 응용 프로그램을 만드는 경우 abort()stdio 함수를 다시 구현할 때 __aeabi_assert()가 작동합니다.

또 다른 타겟 조정 솔루션은 __aeabi_assert() 함수 자체를 다시 구현하는 것입니다. 함수 프로토타입은 다음과 같습니다.

void __aeabi_assert(const char *expr, const char *file, int line);

인수 설명:

  • exprTRUE가 아닌 식의 문자열 표현을 가리킵니다.

  • fileline은 어설션의 소스 위치를 식별합니다.

ARM C 라이브러리에서 제공하는 __aeabi_assert()의 동작은 stderr의 메시지를 표시하고 abort()를 호출하는 것입니다.

__ASSERT_MSG를 정의하여 상위 최적화 수준에서 __aeabi_assert()의 기본 동작을 복원할 수 있습니다.

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AK
Non-Confidential