У меня немного необычная ситуация: я хочу использовать оператор goto для перехода в в цикл, а не выпрыгивать из него.
Есть серьезные причины для этого - этот код должен быть частью некоторой функции, которая делает некоторые вычисления после первого вызова, возвращается с запросом на новые данные и требует еще одного вызова для продолжения. Указатели функций (очевидное решение) нельзя использовать, поскольку нам нужна совместимость с кодом, который не поддерживает указатели на функции.
Я хочу знать, безопасен ли код ниже, т.е. он будет правильно скомпилирован всеми стандартными компиляторами C/С++ (нам нужны как C, так и С++).
function foo(int not_a_first_call, int *data_to_request, ...other parameters... )
{
if( not_a_first_call )
goto request_handler;
for(i=0; i<n; i++)
{
*data_to_request = i;
return;
request_handler:
...process data...
}
}
Я изучал стандарты, но информации о таком случае использования мало. Я также задаюсь вопросом, будет ли замена для эквивалентной , тогда как будет полезной с точки зрения переносимости.
Спасибо заранее.
UPD: Спасибо всем, кто прокомментировал!
-
всем комментаторам:) да, я понимаю, что я не могу перепрыгнуть через инициализаторы локальных переменных и что мне нужно сохранять/восстанавливать
i
для каждого вызова. -
о сильных причинах:) Этот код должен реализовывать интерфейс обратной связи. Обратное сообщение - это шаблон кодирования, который пытается избежать использования указателей функций. Иногда он должен использоваться из-за устаревшего кода, который ожидает, что вы будете использовать его.
К сожалению, r-comm-интерфейс не может быть реализован красиво. Вы не можете использовать указатели на функции, и вы не можете легко разделить работу на несколько функций.