mik*_*yra 3 pointers parameter-passing vala
我实际上在使用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; }
Run Code Online (Sandbox Code Playgroud)
将值设置为out参数"b"时,Vala将确保"b"不为空.因此,如果您对此值不感兴趣,则可以安全地传递null作为method_1()的第二个参数.
看一下生成的C代码,很明显,与上面提出的声明相矛盾,而不是在赋值之前进行检查,而是可以很好地取消引用可能的NULL指针.
void method_1 (gint a, gint* b, gint* c) {
*b = a + (*c);
*c = 3;
}
Run Code Online (Sandbox Code Playgroud)
我期望的代码将采用这种形式:
void method_1 (gint a, gint* b, gint* c) {
if (b != NULL)
*b = a + (*c);
*c = 3;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的唯一解决方法是抛弃整个参数声明,直接用指针代替.
void method_1 (gint a, int* b, ref int c) {
if (b != null)
*b = a + c;
c = 3;
}
Run Code Online (Sandbox Code Playgroud)
对于美学家来说,我非常喜欢上面引用中提到的想法,所以我想问下面的内容
我是否误解了上面引用的描述,并且声明的value-type参数无法自动检查空指针?
或者这可能是vala编译器中的一个错误,在以后的版本中修复了吗?
valac --version返回Vala 0.8.1所以这是我正在使用的版本.
是否有任何其他机会可以通过我仍然缺少的任何语言元素手动检查声明的值类型参数?
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;
}
}
Run Code Online (Sandbox Code Playgroud)