【问题标题】:How to cast lambda in Vala如何在 Vala 中投射 lambda
【发布时间】:2023-03-26 15:59:01
【问题描述】:

继续接收来自cc(不是valac)的编译时冲突。试图投射 lambda,但不知道如何。我是新来的瓦拉。希望有人可以提供帮助。非常感谢。下面的代码是一个示例,cc 将抱怨 lambda 的类型不正确,即方法 foreach 的参数。我使用的 Vala 是 0.36.1 版,cc 是 4.9.2 版。

public static int main(string[] args)
{
    var hash = new GLib.HashTable<string, string>(GLib.str_hash, GLib.str_equal);
    hash.insert("one", "apple");
    hash.insert("two", "banana");
    hash.insert("three", "cherry");
    hash.foreach((key, val)=>stdout.printf("%s => %s\n", key, val));
    return 0;
}

【问题讨论】:

    标签: lambda delegates vala


    【解决方案1】:

    您可以放心地忽略来自 C 编译器的警告,只要

    1. 您自己没有编写 VAPI 绑定。然后,您应该确保 C 警告尽可能少。

    2. 它们不是错误,但无论如何您都无法创建二进制文件。

    我通常将“-X -w”传递给 vala 编译器以抑制 C 警告。

    无论如何,让我们看看您的具体示例,我收到此警告(MSYS2 64 位 Windows 上的 GCC 6.3.0):

    d:/msys64/home/Admin/hash-test.vala.c: In function '_vala_main':
    d:/msys64/home/Admin/hash-test.vala.c:69:30: warning: passing argument 2 of 'g_hash_table_foreach' from incompatible pointer type [-Wincompatible-pointer-types]
      g_hash_table_foreach (hash, ___lambda4__gh_func, NULL);
                                  ^~~~~~~~~~~~~~~~~~~
    In file included from D:/msys64/mingw64/include/glib-2.0/glib.h:50:0,
                     from d:/msys64/home/Admin/hash-test.vala.c:5:
    D:/msys64/mingw64/include/glib-2.0/glib/ghash.h:99:13: note: expected 'GHFunc {aka void (*)(void *, void *, void *)}' but argument is of type 'void (*)(const void *, const void *, void *)'
     void        g_hash_table_foreach           (GHashTable     *hash_table,
                 ^~~~~~~~~~~~~~~~~~~~
    

    重要的是这一点(我已将其对齐以便​​更好地比较):

    expected    'GHFunc {aka void (*)(      void *,       void *, void *)}'
    but argument is of type 'void (*)(const void *, const void *, void *)'
    

    所以这是一个经典的 const 更正警告。

    lambda 有两个 const 参数,但 g_hash_table_foreach 的函数指针类型 (GHFunc) 是用更宽松的非常量指针声明的。

    这应该不是问题,因此您可以放心地忽略它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多