如何在Vala中施放lambda

时间:2017-04-18 10:43:35

标签: lambda delegates vala

继续接收cc(不是valac)的编译时间交战。试图施放lambda,但不知道如何。我是Vala的新手。希望有人能提供帮助。非常感谢。以下代码是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;
}

1 个答案:

答案 0 :(得分:2)

只要

,您就可以安全地忽略来自C编译器的警告
  1. 您不是自己编写VAPI绑定。然后,您应该确保尽可能少的C警告。

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

  3. 我通常将“-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 correctnes警告。

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

    这应该不是问题,所以你可以放心地忽略它。