2015-10-10 2 views
4

Что это путь D для завершения/выхода из основной функции?D: Как выйти из основного?

import std.stdio; 
import core.thread; 

void main() 
{ 
    int i; 
    while (i <= 5) 
    { 
     writeln(i++); 
     core.thread.Thread.sleep(dur!("seconds")(1)); 
    } 
    if (i == 5) 
    { 
     writeln("Exit"); 
     return; // I need terminate main, but it's look like break do exit only from scope 
    } 
    readln(); // it's still wait a user input, but I need exit from App in previous step 
} 

Я пытался прибегая к помощи и нашел следующий вопрос D exit statement есть предложение использовать функцию выхода C. Есть ли новые фьючерсы в современном D, которые позволяют сделать это более элегантно?

+5

Ответный заявление в вашем код выйдет из программы. У вас есть одна логика - когда цикл while завершается, i == 6, а не 5. –

+0

@ AdamD.Ruppe, о, вы правы, есть ли способ исправить его во время цикла или только возможное исправление is 'if (i == 6)'? –

+0

Как сказал Адам, 'if (i == 5)' всегда false. Вы можете написать 'if (i == 6)', если вы хотите выполнить ветку 'if'. Или вы намеревались иметь 'if' внутри цикла? Использование оператора post-increment изменяет выходные данные вашей программы, но все равно выходит из цикла с 'i == 6'. –

ответ

3

Импорт STDLIB и выход вызова при переходе 0.

import std.c.stdlib; 
    exit(0); 
+1

Это не работает финализаторы. –

4

Если вы не делаете аварийный выход, то вы хотите, чтобы очистить все. Я создал ExitException для этой цели:

class ExitException : Exception 
{ 
    int rc; 

    @safe pure nothrow this(int rc, string file = __FILE__, size_t line = __LINE__) 
    { 
     super(null, file, line); 
     this.rc = rc; 
    } 
} 

Вы закодировать свой main() функцию тогда как

int main(string[] args) 
{ 
    try 
    { 
     // Your code here 
    } 
    catch (ExitException e) 
    { 
     return e.rc; 
    } 
    return 0; 
} 

В точке, где вам нужно выйти вы звоните

throw new ExitException(1);