3

问题:

我实际上在使用 Vala/Tutorial 网站上关于输出参数声明的看似不错的功能时遇到问题。

这里引用来自:https ://live.gnome.org/Vala/Tutorial#Parameter_Directions

下面是如何实现 method_1() 的示例:

void method_1(int a, out int b, ref int c) {
    b = a + c;
    c = 3; }

当将值设置为 out 参数“b”时,Vala 将确保“b”不为空。因此,如果您对此值不感兴趣,则可以安全地将 null 作为 method_1() 的第二个参数传递。

看一下生成的 C 代码,似乎很明显,与上面的声明相矛盾,而不是在分配之前进行检查,而是很高兴地取消引用可能的 NULL 指针。

void method_1 (gint a, gint* b, gint* c) {
    *b = a + (*c);
    *c = 3;
}

我期望的代码会采用这种形式:

void method_1 (gint a, gint* b, gint* c) {
    if (b != NULL)
      *b = a + (*c);
    *c = 3;
}

到目前为止,我发现的唯一解决方法是将整个 out 参数声明扔掉,而是直接使用指针。

void method_1 (gint a, int* b, ref int c) {
    if (b != null)
      *b = a + c;
    c = 3;
}

对于审美共鸣,我非常喜欢上面引用中提到的想法,所以我想问以下问题

问题:

  • 我是否误解了上面引用中的描述,并且声明的值类型参数不能自动检查空指针?

  • 或者这可能是 vala 编译器中的一个错误,在以后的版本中修复了? valac --version返回Vala 0.8.1所以这是我正在使用的版本。

  • 是否有任何其他机会通过我仍然缺少的任何语言元素手动检查声明的值类型参数?

4

1 回答 1

5

Vala 0.8.1 是你的问题。Vala 0.16 出品

void method_1 (gint a, gint* b, gint* c) {
  gint _vala_b = 0;
  gint _tmp0_;
  gint _tmp1_;
  _tmp0_ = a;
  _tmp1_ = *c;
  _vala_b = _tmp0_ + _tmp1_;
  *c = 3;
  if (b) {
    *b = _vala_b;
  }
}
于 2013-02-14T01:31:17.170 回答