函数中的相互依赖函数声明

时间:2013-12-08 15:20:53

标签: function scope d function-calls

是否可以有两个或多个外部函数作用域函数相互具有相互调用依赖关系?

我问,因为

void main(string args[]) {
    int x = 42;
    void a() {
        // do something with x
        b();
    }
    void b() {
        // do something with x
        a();
    }
}

DMD中的错误

/home/per/Work/justd/t_funs.d(5): Error: undefined identifier b

如果不是,这是一个未解决的问题或功能?

3 个答案:

答案 0 :(得分:3)

您可以在a之前声明代理b,然后分配b

void main(string args[]) {
    int x = 42;
    void delegate() b;
    void a() {
        // do something with x
        b();
    }
    b = delegate void () {
        // do something with x
        a();
    };
}

它需要一个重构但不像把它全部扔在结构中那么糟糕

答案 1 :(得分:2)

让我们说你可以。然后你可以这样做:

void main(string args[]) {
    void a() {
        b();
    }
    a();
    int x = 42;
    void b() {
        // do something with x
        a();
    }
}

中提琴 - 在宣布之前使用x

有一些解决方法 - 就像棘轮怪说你可以使用委托,但你也可以使用结构:

void main(){
    int x=5;
    struct S{
        void a(){
            writefln("in a, x=%d",x);
            --x;
            if(0<x){
                b();
            }
        }
        void b(){
            writefln("in b, x=%d",x);
            --x;
            if(0<x){
                a();
            }
        }
    }
    S().a();
}

请注意,两个解决方案都会在声明之前阻止使用x。如果使用委托,则在为其分配函数之前无法调用它,只有在声明了另一个函数后才能调用它,这在声明x之后发生。如果使用结构,则不能在结构之前声明x - 但是只能在声明结构后调用函数 - 这也意味着在声明x之后。

答案 2 :(得分:2)

这是设计的:“与模块级声明不同,函数范围内的声明按顺序处理。” (http://dlang.org/function.html#variadicnested

不知道原理。