警告和断言

警告和断言

GLib 定义了若干警告函数和断言,在调用函数时,可用于警告程序错误,并从命令行程序打印错误消息。

前置条件断言

g_return_if_fail()g_return_val_if_fail()g_return_if_reached()g_return_val_if_reached() 宏用作前置条件断言,用于公有函数开头,以检查该函数的参数是否可接受。此类前置条件断言的任何失败都视为公有 API 的调用者出现的编程错误,此后,该程序的状态将被视为未定义。它们类似于 libc assert() 函数,但提供了更多关于失败的上下文。

例如

gboolean
g_dtls_connection_shutdown (GDtlsConnection  *conn,
                            gboolean          shutdown_read,
                            gboolean          shutdown_write,
                            GCancellable     *cancellable,
                            GError          **error)
{
  // local variable declarations

  g_return_val_if_fail (G_IS_DTLS_CONNECTION (conn), FALSE);
  g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);

  // function body

  return return_val;
}

g_warn_if_fail()g_warn_if_reached() 的行为类似,但它们不会在出现失败时中止程序。但是,如果它们出现失败,程序应被视为处于未定义状态。

消息

g_print()g_printerr() 用于输出命令行应用程序,因为它们会默认输出到标准输出和标准错误 — 而 g_message()g_log() 等函数可能会重定向到专用的消息窗口、文件或系统日志。

可以使用 g_set_print_handler()g_set_printerr_handler() 覆盖默认打印处理程序。

编码

如果控制台编码不是 UTF-8(由 g_get_console_charset() 指定),则这些函数会首先转换消息。所有未由该字符集定义的 Unicode 字符都将替换为 '?'。在 Linux 中,必须在 main() 中尽早调用 setlocale() 以加载编码。可以通过为 g_set_print_handler()g_set_printerr_handler()g_log_set_handler() 提供自定义处理程序来改变此行为。

调试实用程序