2.5.3. 从程序中退出

程序可以在 main() 末尾正常退出,或者在出现错误时提前退出。

从声明中退出

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, intline);

其中:

  • expr 指向非 TRUE 的表达式的字符串表示形式

  • fileline 指定断言的源位置。

ARM C 库中提供的 __aeabi_assert() 的行为是,在 stderr 中输出消息并调用 abort()

可通过在较高优化级别定义 __ASSERT_MSG 来恢复 __aeabi_assert() 的缺省行为。

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