Ссылка goto из одной функции в другую - C (СИ)
Формулировка задачи:
Доброго времени суток! Возник следующий вопрос: неужели имея в программе 2 функции, нельзя из одной из них методом goto перейти в другую функцию?
Либо как можно обойти эту проблему?
void main (void)
{
somefunction();
gohere:
printf('blah');
}
void newfunc(void)
{
...
goto gohere:
}Решение задачи: «Ссылка goto из одной функции в другую»
textual
Листинг программы
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
enum error
{
E_NONE,
E_ARGC,
E_OPEN,
E_READ
};
static jmp_buf env_buf;
void run(int argc, char* argv[])
{
FILE* file;
char buf[BUFSIZ];
if(argc != 2)
longjmp(env_buf, E_ARGC);
if((file = fopen(argv[1], "r")) == NULL)
longjmp(env_buf, E_OPEN);
while(fgets(buf, BUFSIZ, file) != NULL)
fputs(buf, stdout);
if(ferror(file))
{
fclose(file);
longjmp(env_buf, E_READ);
}
fclose(file);
}
int main(int argc, char* argv[])
{
int ret = EXIT_SUCCESS;
int err;
if((err = setjmp(env_buf)) == 0)
run(argc, argv);
else
{
ret = EXIT_FAILURE;
switch(err)
{
case E_NONE: /* не выполнится никогда, т.к. longjmp(env_buf, 0) == longjmp(env_buf, 1) */
break;
case E_ARGC:
fprintf(stderr, "Usage: %s FILENAME\n", argv[0]);
break;
case E_OPEN:
fprintf(stderr, "Can't open file %s\n", argv[1]);
break;
case E_READ:
fprintf(stderr, "Error reading file %s\n", argv[1]);
break;
default:
fprintf(stderr, "Unknown error was signalled\n");
break;
}
}
exit(ret);
}