0

function()呼び出す がありますanotherFunction()。の内部anotherFunction()には、if満たされたときに に戻り、 にmain()ではなく戻るステートメントがありますfunction()。これどうやってやるの?

4

4 に答える 4

5

「標準」C では、そのようなことはできません。setjmp と longjmp を使用して実現できますが、強く勧めしません。

anotherFuntion()から値を返し、その値に基づいて返さないのはなぜですか? このようなもの

int anotherFunction()
{
    // ...
    if (some_condition)
        return 1; // return to main
    else
        return 0; // continue executing function()
}

void function()
{
    // ...
    int r = anotherFuntion();
    if (r)
        return;
    // ...
}

_Bool関数が他の何かを返すために既に使用されている場合は、ポインターを介して戻るか戻ることができます

于 2014-12-05T16:55:01.703 に答える
2

setjmp および longjmp 関数を使用して、C の通常のリターン シーケンスをバイパスできます。

ウィキペディアに例があります。

#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

void second(void) {
    printf("second\n");         // prints
    longjmp(buf,1);             // jumps back to where setjmp was called - making setjmp now return 1
}

void first(void) {
    second();
    printf("first\n");          // does not print
}

int main() {   
    if ( ! setjmp(buf) ) {
        first();                // when executed, setjmp returns 0
    } else {                    // when longjmp jumps back, setjmp returns 1
        printf("main\n");       // prints
    }

    return 0;
}
于 2014-12-05T16:54:09.823 に答える
2

C でこれを行うのは簡単ではありません。最善の策は、からステータス コードを返し、anotherFunction()それを で適切に処理することfunction()です。

(C++ では、例外を使用して目的を効果的に達成できます)。

于 2014-12-05T16:54:23.740 に答える
2

ほとんどの言語には、この種のフロー制御を可能にする例外があります。C にはありませんが、これを行うsetjmp/longjmpライブラリ関数があります。

于 2014-12-05T16:54:32.760 に答える