为什么要使用GLib功能?

Zen*_*net 29 c gtk glib

虽然编程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指针,因此在前面对它进行排序.

  • 如果传递一个`NULL`指针,标准的`free`被定义为no-op,所以`g_free`在那里没有奖励. (27认同)
  • 将`g_malloc()`与`g_free()`匹配而不是libc中的`free()`仍然是一个好主意.我观察到在Windows上,多个DLL可能链接到`malloc()`的单独版本(具有单独的内部堆结构),混合和匹配会导致崩溃.不确定这是否是真实世界的问题,或者在其他平台上是否属实,但通过使用GLIB的包装器,您可以避免这种情况. (6认同)
  • @ user2548100真正的目标是"他们认为他们比编写C的人更聪明",而实际上他们只是选择以他们喜欢的特定方式使用开放式语言并且符合他们的目的.你不必同意他们的用法或偏好,但不要愚弄他们对语言或其建筑师有贬义的荒谬纱线.我也认为C++与此完全正交,但是嘿. (6认同)
  • @Chris Lutz:野外的一些实现将会出现'free(NULL)`(我在嵌入式项目中看到了这一点).C标准是一回事,现实世界的必需品是另一回事.以下是在另一个平台上看到它的人:/sf/answers/135713091/.这就是GLib的用途:真实世界的可移植性. (4认同)
  • 我对任何考虑使用Gnome的人的建议是使用C++作为STL.您可以使用STL编写"无类C++" - 直接C语言.效果很好.Gnome项目中的范围蠕变量非常荒谬.他们真的认为他们比编写C语言的人更聪明,他们试图在每一个角落"修复"语言.它不需要修复. (2认同)

Bob*_*Bob 7

用于多个操作系统中的一致行为.这是一个便携性的东西.

在除Linux之外的其他一些unix环境中,或者如果您的程序是在Windows上编译的,那些某些功能可能在目标操作系统上不存在或行为不同.

使用glib版本可确保一致的行为.

  • 不,不是.Visual Studio不支持它(/sf/ask/10246701/#146419).此外,C99和C89非常有限 - 对于大多数非平凡的项目,您至少需要一些来自POSIX/Windows API的函数(想想dlopen,线程,套接字,原子,内存映射文件......),所以你'我想要某种可移植性层. (4认同)

lib*_*rce 5

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)有助于避免这种胡说八道。除非您有非常具体的性能限制,否则您不应该重新开发那些东西。