2013-12-08 62 views
0

是否有兩個或多個外部函數作用域函數可以彼此具有相互調用依賴關係?函數中的相互依賴函數聲明

我這麼問是因爲

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 

如果不是這是一個懸而未決的問題或功能?

+0

通過在主外部聲明它們 –

+0

有時您希望作用域函數訪問作用域數據(在本例中爲main)。那麼在D中無法實現這一點?編譯器無法做到這一點似乎很奇怪。也許它與D是一種單程語言我猜。我可以沒有它。我只需要在我的項目中進行更多的重構。 –

+1

這不是一次通過,但你可以在a之前聲明一個函數delegate並將它賦值給它我認爲 –

回答

3

你可以前的申報委託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(); 
    }; 
} 

這將需要重構,但不是那麼糟糕,因爲它扔在所有結構

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

這是設計:「與模塊級聲明不同,函數範圍內的聲明按順序處理。」 (http://dlang.org/function.html#variadicnested

雖然不知道理由。

+1

Idan Arye的回答給出了一個很好的解釋。如果您在聲明它之前訪問該變量,它可能是任何值。即使前向訪問可能可以被處理,因爲初始化器可能是一個變量,因此只有在運行時才知道,訪問它會有未定義的行爲(最好) –