警告和断言
警告和断言
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()
提供自定义处理程序来改变此行为。