虽然编程C和GTK +,为什么会"更好"来使用g_strdup_printf,g_free,g_strcmp0等...和同事glib函数?
Sté*_*hen 30
通常,GLib的目的是实用程序和可移植性库.这些本身就是考虑使用它的理由.
您提到的特定功能都提供了额外的C标准库变体:
g_strdup_printf就像sprintf,但实际上为您分配缓冲区,并节省了缓冲区应该有多大的猜测.(返回值应为g_free'd.)g_free就像free,但检查一个NULL指针.g_strcmp0就像strcmp,但是像空字符串一样处理NULL指针,因此在前面对它进行排序.用于多个操作系统中的一致行为.这是一个便携性的东西.
在除Linux之外的其他一些unix环境中,或者如果您的程序是在Windows上编译的,那些某些功能可能在目标操作系统上不存在或行为不同.
使用glib版本可确保一致的行为.
GLib 提供了您现在期望从任何编程语言中获得的可移植性和基本内容,例如集合类型(链表、数组、哈希表等)。以下是 GLib 可以为您带来的一些好处。
可移植性
GLib 的重点不是要移植到 C 标准,而是要移植到标准的实现。GLib 负责处理那些乍一看似乎毫无用处的已知怪癖,直到您需要将代码移植到具有这些令人讨厌的错误的平台上。
让我们举个例子g_free,因为很多人批评它。有些平台free(NULL)会失败,即使 C99 说它应该可以工作。该检查至少从 1998 年就存在(我在 git 历史记录中对其进行了跟踪)。有人可能会说它不再需要了,但即使在 2017 年,我也在一家公司工作,该公司NULL在打电话之前free会检查,否则它会在他们的嵌入式平台上崩溃。当您想要进行一些严重的内存调试时,它还可以作为对代码进行插桩的包装器。
可读性
它通过提供一些包装函数来帮助提高代码的可读性,这些包装函数不仅可以提高可移植性,还可以帮助您避免许多语言陷阱。你们中有多少人测试malloc它是否返回NULL?如果它返回NULL,你们中有多少人有办法恢复,因为你基本上内存不足?
g_malloc如果应用程序无法分配您想要的内容,它将中止应用程序,并且在许多应用程序中,这正是您想要的行为。对于可能失败的非常大的分配,您有g_try_malloc. 这与 malloc 相同,但仍然为您提供了作为可用于检测的包装器的好处。
能够写:
char *buffer = g_malloc(30);
/* Do something with it ... */
g_free (buffer);
Run Code Online (Sandbox Code Playgroud)
...解放思想,让开发人员专注于她试图完成的任务。它还避免了您的程序在很晚之后崩溃,因为它尝试使用NULL指针写入并且您必须跟踪分配。
标准的 C 库充满了陷阱,不必对您编写的每一行代码进行微观管理,这是一种解脱。只需阅读联机帮助页中某些功能的BUGS部分,您就会看到。更少的样板代码来检查错误使代码更易于阅读,从而提高了可维护性,并减少了错误。
特征
另一点是 GLib 提供的大量集合类型,您不必重新实现。仅仅因为重新实现链表很容易并不意味着您应该这样做。我曾在另一家公司工作,该公司提供带有多个链表实现的代码,因为一些开发人员可能只是患有Not Invented Here综合症,并且会重新开发他们自己的。一个常见的、经过彻底测试的、广泛使用的库(如 GLib)有助于避免这种胡说八道。除非您有非常具体的性能限制,否则您不应该重新开发那些东西。