如何解决Vala中函数参数为const的编译警告?
解决Vala中Gtk.TreeRowReference.get_path()的const限定警告
这个警告的根源是GTK的C API设计和Vala类型系统之间的小冲突:gtk_tree_row_reference_get_path()函数的参数没有声明为const,但Vala在遍历列表元素时,默认会把元素视为不可修改(const)的引用,导致传递参数时触发"丢弃const限定符"的警告。
下面是两种简洁的解决方法:
方法1:强制类型转换消除const限定
在调用get_path()时,将treeRowRef强制转换为非const的Gtk.TreeRowReference,明确告诉编译器我们确认这个调用不会修改实例:
foreach (unowned Gtk.TreeRowReference treeRowRef in treeRowRefs) { // 强制转换去掉const限定 var path = ((Gtk.TreeRowReference) treeRowRef).get_path(); if (treeModel.get_iter(out treeIter, path)) { fileListStore.remove(treeIter); } }
方法2:使用List迭代器替代foreach
直接使用List的迭代器获取元素,这样拿到的是非const的引用,从根源上避免警告:
var rowRefIter = treeRowRefs.begin(); while (rowRefIter != null) { unowned Gtk.TreeRowReference treeRowRef = rowRefIter.data; if (treeModel.get_iter(out treeIter, treeRowRef.get_path())) { fileListStore.remove(treeIter); } rowRefIter = rowRefIter.next(); }
额外说明
这个警告本质上是GTK C API的一个小瑕疵——gtk_tree_row_reference_get_path()其实不会修改传入的GtkTreeRowReference,应该声明为const参数。但既然我们无法修改GTK的API,上面的两种方法都可以安全地消除警告,同时保持代码的正确性。
内容的提问来源于stack exchange,提问作者selvask




