作者:360691894_8a5c48 | 2023-08-09 14:35
虽然编程C和GTK +,为什么会"更好"来使用g_strdup_printf
,g_free
,g_strcmp0
等...和同事glib函数?
1> Stéphan Koch..:
通常,GLib的目的是实用程序和可移植性库.这些本身就是考虑使用它的理由.
您提到的特定功能都提供了额外的C标准库变体:
g_strdup_printf
就像sprintf
,但实际上为您分配缓冲区,并节省了缓冲区应该有多大的猜测.(返回值应为g_free
'd.)
g_free
就像free
,但检查一个NULL指针.
g_strcmp0
就像strcmp
,但是像空字符串一样处理NULL指针,因此在前面对它进行排序.
如果传递一个`NULL`指针,标准的`free`被定义为no-op,所以`g_free`在那里没有奖励.
将`g_malloc()`与`g_free()`匹配而不是libc中的`free()`仍然是一个好主意.我观察到在Windows上,多个DLL可能链接到`malloc()`的单独版本(具有单独的内部堆结构),混合和匹配会导致崩溃.不确定这是否是真实世界的问题,或者在其他平台上是否属实,但通过使用GLIB的包装器,您可以避免这种情况.
@ user2548100真正的目标是"他们认为他们比编写C的人更聪明",而实际上他们只是选择以他们喜欢的特定方式使用开放式语言并且符合他们的目的.你不必同意他们的用法或偏好,但不要愚弄他们对语言或其建筑师有贬义的荒谬纱线.我也认为C++与此完全正交,但是嘿.
@Chris Lutz:野外的一些实现将会出现'free(NULL)`(我在嵌入式项目中看到了这一点).C标准是一回事,现实世界的必需品是另一回事.以下是在另一个平台上看到它的人:/sf/ask/17360801/.这就是GLib的用途:真实世界的可移植性.
我对任何考虑使用Gnome的人的建议是使用C++作为STL.您可以使用STL编写"无类C++" - 直接C语言.效果很好.Gnome项目中的范围蠕变量非常荒谬.他们真的认为他们比编写C语言的人更聪明,他们试图在每一个角落"修复"语言.它不需要修复.
2> Bob..:
用于多个操作系统中的一致行为.这是一个便携性的东西.
在除Linux之外的其他一些unix环境中,或者如果您的程序是在Windows上编译的,那些某些功能可能在目标操作系统上不存在或行为不同.
使用glib版本可确保一致的行为.
不,不是.Visual Studio不支持它(/sf/ask/17360801/#146419).此外,C99和C89非常有限 - 对于大多数非平凡的项目,您至少需要一些来自POSIX/Windows API的函数(想想dlopen,线程,套接字,原子,内存映射文件......),所以你'我想要某种可移植性层.