在使用较旧和较新的 GLib 版本时,将 g_autoptr() 与 G_DEFINE_AUTOPTR_CLEANUP_FUNC() 一起使用

Using g_autoptr() together with G_DEFINE_AUTOPTR_CLEANUP_FUNC() when using older and newer GLib versions

在使用我不理解的不同 GLib 版本时,将 g_autoptr() 与 G_DEFINE_AUTOPTR_CLEANUP_FUNC() 一起使用会有些问题(这也会影响其他 g_auto.. . 变体及其 G_DEFINEs).

documentation 表示

"The way to clean up the type must have been defined using the macro G_DEFINE_AUTOPTR_CLEANUP_FUNC()"

当使用例如 GLib 2.62 和使用 G_DEFINE 宏时,这会导致像

这样的错误
/usr/include/glib-2.0/glib/gmacros.h:1032:49: error: redefinition of ‘glib_slistautoptr_cleanup_GtkTreePath’
 1032 | #define _GLIB_AUTOPTR_SLIST_FUNC_NAME(TypeName) glib_slistautoptr_cleanup_##TypeName

省略 G_DEFINE 宏即可解决问题,程序运行正常。

然而,在较旧的 GLib 版本如 2.50(例如 Debian 9 仍在使用)上,使用 G_DEFINE 宏不会导致错误消息。但我看不到 GLib 文档反映的任何更改。我无法确定上述行为改变的确切时间。当我想从 2.50 开始支持所有 GLib 版本时,我应该如何处理这个问题?

问题可能出在 Gtk 中,而不是 GLib。 g_autoptr() 在 Gtk+ 3.22(Debian 9 中的那个)中的大部分内容已经得到支持:因此您不必自己在 Gtk 类型上调用 G_DEFINE_AUTOPTR_CLEANUP_FUNC()。然而,GtkTreePath 仍然缺少调用:这是在 3.24 中添加的,请参阅 https://gitlab.gnome.org/GNOME/gtk/-/commit/86dd1e37a70e9bae057a9a11332f7254cda242e8

如果你想在 Gtk < 3.24 上使用 g_autoptr() 和 TreePath,你可能必须在版本检查后进行宏调用。