goto ist eine schlechte Anweisung die nahezu keine Existenzberechtigung besitzt. Sie gilt immer als schlechter Stil und kann in 99,9957% der Fälle durch anders strukturierten Code ersetzt werden. Die folgenden Beispiele dienen nur zu Anschauungszwecken. NICHT NACHMACHEN! 

Der Befehl goto springt zur angegebenen Sprungmarke und überspringt alle Anweisungen bis dahin.

#include <stdio.h>

int main()
{
    printf("1\n");

    goto LABEL_EXIT;

    printf("2\n");

    LABEL_EXIT:

    printf("3\n");

    return 0;
}

Quasi der einzige Anwendungsfall für die Anweisung-die-nicht-genannt-werden-soll ist, die Deduplizierung von Fehlerbehandlungscode:

#include <stdio.h>
#include <malloc.h>
#include <limits.h>

int foo(int n, int **pRes) {
    int *pArr = calloc(n, sizeof(int));
    if (NULL == pArr) {
        goto ERROR;
    }

    for(int i = 0; i < n; i++) {
        long long m = (long long)i * (long long)i;
        if (m > INT_MAX) {
            goto ERROR;
        }
        pArr[i] = i * i;
    }
    *pRes = pArr;
    return 0;

    ERROR:
    free(pArr);
    return -1;
}

int main()
{
    const int n = 10;
    int *pArr = NULL;
    if (0 == foo(n, &pArr)) {
        for (int i = 0; i < n; ++i) {
            printf("pArr[%d] = %d\n", i, pArr[i]);
        }
    }
    free(pArr);
    return 0;
}

Der Fehlerbehandlungscode unter "ERROR:" müsste sonst zwei mal implementiert werden. So reicht eine Implementierung aus. Dieses Problem lässt aber oft durch andere Maßnahmen umgehen, was auch die bevorzugte Lösung sein sollte.

Last modified: Friday, 1 June 2018, 11:01 AM