Staatsfeind #1: goto
Completion requirements
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